选择主键

时间:2011-12-23 14:21:41

标签: mysql database primary-key entity-attribute-value

我正在做一个项目,我必须创建一个几乎像维基百科的网站,但在制作数据库时我偶然发现了一个问题。

我似乎无法弄清楚我的主键应该是什么。我尽力在下面说明我的表结构,这样你就可以看到问题了。

name            | type        | content   |
--------------------------------------
John Doe        | overview    | some text |
----------------------------------------
John Doe        | background  | some text |
----------------------------------------
John Doe        | height      | some text |
----------------------------------------
Fred Flintstone | overview    | some text |
---------------------------------------
Fred Flintstone | background  | some text |

我认为只创建一个id列并自动增加它是有意义的,因为每个记录都是无用的。

你怎么看?是一个需要的主键?如果是这样的话应该是什么?

3 个答案:

答案 0 :(得分:4)

我肯定会选择Auto Increment primary ID。这就是它的用途,它使得维护和更新表更容易,并且在关系设置中链接到其他表也更容易。

查找记录时还有性能问题。

总结一下:

  
      
  • 维护表之间的关系
  •   查找记录时,
  • 效果
  •   
  • 更轻松在更改内容时编写更新和删除查询
  •   

请参阅:http://code.openark.org/blog/mysql/reasons-to-use-auto_increment-columns-on-innodb

答案 1 :(得分:1)

我建议你创建一个id列作为主键,再创建一个表来映射记录,如概述,背景,高度

id overview  background height 
1      1           3         5

虽然这种类型的架构没有完全规范化。另外,你可以为概览,背景和高度制作不同的表格,然后为它们创建一个如上所述的关系表。

答案 2 :(得分:1)

在开展更多工作之前,请先查看mediawiki.org

在您的示例数据中,{name,type}唯一标识每一行。但您的样本数据不具代表性。名称在现实世界中并不是唯一的,因此您可能需要一些其他方式来识别人员。只是添加一个自动增量ID号作为主键是行不通的,因为它允许这样的废话。

id  | name            | type        | content   |
--------------------------------------
1   | John Doe        | overview    | some text |
2   | John Doe        | overview    | some text |
3   | John Doe        | overview    | some text |
4   | John Doe        | overview    | some text |

有多少不同的人? (有3个,ID号为1和3的John是同一个人。){name,type}上的UNIQUE约束也无济于事,因为这样只允许一个名为“John Doe”的人数据库中。

那么您还知道还有什么可以用来识别人物?电子邮件地址? (不要在这里寻找灵丹妙药。没有。甚至可以共享电子邮件地址。你只是寻找比“名字”更好的东西。)