【问题标题】:Using full names as primary key vs creating an additional field使用全名作为主键与创建附加字段
【发布时间】:2016-02-28 21:50:34
【问题描述】:

假设我们有两张桌子。一种是看电影的。电影表包含电影名称、发行年份以及主演的字段。另一张桌子是给主要演员的。它包含演员姓名和出生日期的字段。

出生日期字段取决于姓名字段。使用演员全名作为主键有意义吗?如果性能不是问题怎么办?

【问题讨论】:

  • 主键必须是唯一的,演员姓名不能保证这一点。
  • 此外,众所周知,演员会不时更改姓名,并且 PK 值不应在数据的整个生命周期内更改。
  • 即使排除已经提出的独特性问题(这应该足以劝阻您),您为什么要这样做?
  • 少一个字段,简单地说。我可能应该问一个只有一个字段的表,比如一个流派。假设由于某种原因,必须将其制成单独的表。
  • 如果您要使用名称执行此操作,则“actors”表中会少一个(通常为 4 字节)int 字段,但最终会得到两个(大得多的)char 或 varchar 字段在每个必须引用参与者的表中。就该流派表而言,您可以在电影表中只包含一个 varchar 字段,但是每当您想发布当前注册流派的列表时,您都需要select distinct genre from movies ......这可能会产生多个(错误) 拼写也更难管理。

标签: mysql relational-database


【解决方案1】:

通常使用名称字段,甚至是全名字段作为主键是没有意义的。那是因为您想在现实世界中为您的数据库建模,而在现实世界中,人们的名字并不是唯一的。

现在,也许 20 世纪的美国电影演员有独特的名字。但那是意外,而不是现实。

在图书馆学领域,演员姓名等内容的列表称为“受控词汇表”。如果您想了解这种经过数百年经验总结出来的事情的方法,那值得一看。

要在 DBMS 中实现受控词汇表,您将使用带有(自动递增)id 编号的表。你可以把这个人的名字放在第二列,出生日期放在另一列,等等。如果这个人有别名(例如,“Prince”、“The Artist以前称为Prince”和“TAFKAP”),你可能在您的词汇表中包含一个别名表。这将包含成对的 id 号。

(请注意,甚至美国的社会安全号码都不是唯一的。社会安全局曾经犯过发布社会安全卡图片的错误;很多人使用该卡上显示的号码。)

不用担心性能。电影演员的总数,包括演员、替身演员和特技演员在内,即使附加了 ID 号,也完全在小型 DBMS 系统的能力范围内。

【讨论】:

    【解决方案2】:

    看来您有两个问题:

    1.使用演员全名作为主键有意义吗?

    这并非不可能 - 但正如其他评论者所指出的那样,这是不可取的。一个原因是演员可能会更改他们的名字(另请参阅list of actors who have changed their name)。

    此外,多个演员可能有相同的名字,所以全名不是主键的好候选者。

    您最好使用有保证的唯一字段,例如 UUIDauto-increment 字段来识别您的演员。

    2。如果性能不是问题怎么办?

    我不认为这真的是一个性能问题,而是一个逻辑数据建模问题。您可以有一个有效的主键,它是一个字符串(例如名称),但在这种情况下,这不是一个合适的字段。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-09
      • 1970-01-01
      • 1970-01-01
      • 2011-06-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多