出于讨论目的,我的示例将涉及伪 C# 代码,但这并不特定于任何单一语言或数据库工具。
拿一个简单的模型
客户 { string Id }
当我存储 new Customer()
时使用 RavenDB,它将在执行时为我生成一个 ID,假设为“Customers/234”。在这种情况下,我可以接受 id 是 RavenDB 的一个方面。从根本上说,这与 Guid.NewGuid().ToString()
完全没有区别,因为它创建了一个标识符,该标识符没有人类可理解的含义,只是实现了全局唯一性(对该数据库)的目标。这可以说是一个更好的 guid 版本,将创建更好的 URL 并允许人们在需要时传达他们的 id,这比 16 个随机十六进制字符的字符串要容易得多。
在另一种情况下:
User { string UserName, string Id }
在这种情况下,我想将真正的语义意义放入我的 Id 而不仅仅是一个唯一的数字。
使用 RavenDB,这可以类似于:
store.Conventions.DocumentKeyGenerator = (entity) =>
{
User user = entity as User;
if(user == null)
return defaultKeyGeneration (entity);
return "Users/" + user.UserName;
}
然后在此存储操作期间,您将以“Users/dotnetchris”结束
我也可以通过使用只读属性而不是让用户拥有一个简单的 Id 属性来解决这个问题:
User {
string Id { get { return "Users/" + UserName }
我很难决定哪一个是这个构造的合适位置。
我倾向于它应该直接包含在类中,因为这给你的信息是很容易通过用户输入的 id 加载这个对象,而不需要实际查询数据库来查找 Users .Where(user.UserName == "dotnetchris")
最佳答案
这似乎高度依赖于数据在数据库中的引用方式或不引用方式。如果数据库设计中的某种约束需要“完整”ID(即 Users/name
),那么将其保持在数据库附近将是更好的选择,但如果不是这种情况,您将受益于将其保留为域模型的一部分以允许代码的灵 active (根据您的最终代码示例)。
关于database - 数据模型驱动的资源 ID 是资源还是数据库的一个方面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9776513/