【问题标题】:What are some practices for assigning unique identifiers to domain objects? [duplicate]将唯一标识符分配给域对象的一些做法是什么? [复制]
【发布时间】:2012-10-13 05:30:20
【问题描述】:

可能重复:
How to choose my primary key?

我有一个具有以下属性的用户类:

  • 用户名(唯一)
  • 密码
  • 电子邮件(唯一)
  • 名字
  • 姓氏
  • 年龄

用户名和电子邮件唯一标识用户的一个实例。在我的数据库中,这些应该用作主键还是应该为每个实例生成不同的唯一标识符。据我所知,在SELECT 上,比较字符串比比较数字要慢。然后我不应该使用自分配的 int、long、double 等,还是在用户的 ID 列中使用AUTO_INCREMENT?使用 UUID 怎么样(又是长字符串的问题)?我的问题也适用于我以后可能添加的所有其他域类。

【问题讨论】:

    标签: mysql database identity


    【解决方案1】:

    主键应该与任何其他字段分开,应该没有商业价值并且应该是唯一的整数。

    示例:一家公司创建了一个包含社会保险号的“用户”表。这些对每个人来说应该是独一无二的。然而,在某些时候,当用户输入 ssn 时,ssn 输入错误。输入错误的号码不存在,记录已保存。一段时间后,另一个用户尝试输入他们的 ssn,它实际上与之前输入错误的数字相同。在公司自己发现并解决此问题之前,用户可能无法实际保存他们的个人资料并继续操作。鉴于这个问题,公司决定在这一点上放宽对 ssn 的“唯一”限制。如果 ssn 不是主键,这将相对容易 - 只需删除唯一约束。如果主键是 ssn,这会更难。

    定义字段为auto_increment,mysql会处理:

    CREATE TABLE Persons
     (
     person_id int NOT NULL AUTO_INCREMENT,
     LastName varchar(255) NOT NULL,
    ...
    

    【讨论】:

    • 是的,这是最佳实践,也是最常见的。放弃它的主要原因通常是性能和数百万行。
    【解决方案2】:

    在生成索引时,我尝试遵循以下提示:http://cherry.world.edoors.com/CzyAhL90b5RA(MySQL 索引提示列表)

    此外,使用用户名或电子邮件会用外键“弄乱”数据库中的其他表,从而使这些表也更难索引。将其设为 int 或 long 并使用 AUTO_INCREMENT。

    【讨论】:

      【解决方案3】:

      请考虑由您的唯一列组成的composite primary key,而不是代理键。这将具有根据您的唯一性要求维护数据完整性的额外好处。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-08-31
        • 2011-03-27
        • 2010-10-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多