database - 数据模型驱动的资源 ID 是资源还是数据库的一个方面?

标签 database model uniqueidentifier ownership

出于讨论目的,我的示例将涉及伪 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/

相关文章:

database - Postgres-Golang-模式与数据库?

java - 在代码中使用 db 值的正确方法是什么

node.js - 如何在nodejs中 'require'数据库模式

sockets - 在onCreate期间使用套接字io : how to subscribe to new Model that fits criteria,航行js?

c# - myVariable(int) == 0 与 myVariable(Guid) == Guid.Empty 相同

python - 我无法在 python 中将行插入到我的 psycopg2 脚本中

MySQL多表选择SUM查询

entity-framework - 如何让所有实体访问 :internal instead of public in EDMX?

android - 如何在 NFC 中获取 Android 手机 UID

algorithm - 如何过滤一个非常非常大的文件