我正在做一个项目,我必须创建一个几乎像维基百科的网站,但在制作数据库时我偶然发现了一个问题。
我似乎无法弄清楚我的主键应该是什么。我尽力在下面说明我的表结构,这样你就可以看到问题了。
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列并自动增加它是有意义的,因为每个记录都是无用的。
你怎么看?是一个需要的主键?如果是这样的话应该是什么?答案 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”的人数据库中。
那么您还知道还有什么可以用来识别人物?电子邮件地址? (不要在这里寻找灵丹妙药。没有。甚至可以共享电子邮件地址。你只是寻找比“名字”更好的东西。)