在我的web应用程序中,用户可以定义文档并给它们一个唯一的名称来标识该文档和一个友好的名称,人类将使用它来引用文档。以下表模式为例:
| id | name | friendly_name |
-----------------------------------------------
| 2 | invoice-2 | Invoice 2 |在本例中,我使用了id列作为主键,它是一个自动递增的数字。由于已经有了文档的自然ID (name),所以我也可以这样做:
| name | friendly_name |
--------------------------------------
| invoice-2 | Invoice 2 |在本例中,name是文档的主键。我们已经消除了id字段,因为它本质上只是name的一个副本,因为表中的每个文档都必须有一个唯一的name。
这也意味着,当我引用来自外键关系的文档时,我不得不称它为document_name,而不是document_id。
这方面的最佳做法是什么?从理论上讲,我完全有可能使用VARCHAR作为主键,但它是否会带来诸如性能开销之类的不利因素?
发布于 2014-09-28 21:24:50
关于这个问题,有两个学派。
有些人坚信,使用“自然密钥”作为实体表的主键是可取的,因为它比代理键具有显著的优势。
还有一些人认为,“代理项”密钥可以提供一些“自然”密钥可能无法提供的理想属性。
让我们总结一下主键的一些最重要和最理想的属性:
(还有一些其他属性可以列出,但其中一些属性可以从上面的属性派生出来( null,可以索引,等等)。
我把“自然”键和“代孕钥匙”作为“最佳”主键的两种思想分为两个阵营:
(一)因先前决定选择天然钥匙为主钥匙而被严重烧伤的人,以及
( 2)尚未被该决定烧死的人。
发布于 2014-09-28 19:27:43
你当然可以。
create table sometbl(
`name` varchar(250) NOT NULL PRIMARY KEY,
`friendly_name` varchar(400)
);访问整数或varchar (除非其太长)键的时间没有任何区别。即使它有,它也不会成为你的主要瓶颈。只要列声明为键,mysql就可以非常快地访问它。
自动递增整数不能成为主键。这只是行的序列号。当你看到真正的对象时,你会发现它没有任何序列号。所以主键应该基于那些真实的属性。
https://stackoverflow.com/questions/26088704
复制相似问题