这个特定场景中是否需要主键?

时间:2009-05-13 04:54:55

标签: mysql database database-design

我有一个名称表(id,first_name,middle_name,last_name,sex) 和一个电子邮件表(id_fk,email_add)

实际上,我将使用第二种类似的表,如电话表(id_fk,phone_no),其中id_fk是引用名称表中id的外键。

是否需要或者更确切地说在第二和第三个表中有一个主键?还是其他类似的表?或者你会建议一个不同的架构?

PS:这些表适用于联系人存储应用

8 个答案:

答案 0 :(得分:4)

在您描述的情况下,主键是整个表(id_fk,phone_no),因为行不以其他方式共享,表示无序集合,并且只有值而不是任何类型的自己的标识。

答案 1 :(得分:2)

我会为每个表添加一个简单的自动递增“id”主键,它的成本非常低,以后可以更容易地引用特定的行。

查看外键的不同命名方案也许是一个好主意,“id_fk”可能有点令人困惑,因为它没有提供它指的是哪个表的“id”,如“name_id” “可能是一个更好的选择。

答案 2 :(得分:2)

我的设计理念是每个表总是有一个int identity pk列。

这似乎是一个有争议的决定,正如之前关于SO的评论所显示的那样,但它也非常方便。

答案 3 :(得分:1)

电话桌有一个主键。每个(id_fk,phone_no)对唯一地定义每个条目,因此,在这种情况下,主键是复合键。

http://weblogs.sqlteam.com/jeffs/archive/2007/08/23/composite_primary_keys.aspx

答案 4 :(得分:1)

使用主键几乎总是更好。即使你认为现在不需要它,因为你的数据库不断增长并且变得更加复杂,你很快就会遇到问题。

就个人而言,我还建议为主键使用数据不可知列,例如guid / uuid / serial。通过使用不包含可用数据的字段,您将永远不会遇到必须更新主键的情况,这可能是数据库增长后的另一个混乱操作。

答案 5 :(得分:1)

您可以将(外键,电话号码)设为复合主键。

我个人赞成使用严格技术的主键,通常意味着自动编号ID列。其中一个优点是,它可以更容易地使用ID更新和删除记录,而不是记住HTML表单中的旧值等。

答案 6 :(得分:1)

您绝对应该拥有所有表的主键。对于(id_fk,phone_no),您可以使用由两列组成的复合键,也可以添加另一列作为主键。我推荐后者,因为它最终会降低一切的复杂性,如果你使用的是ORM,它会更加适应。

答案 7 :(得分:0)

为什么需要单独的电子邮件地址和电话号码表?将它们全部存储在同一个表中效率更高。您的架构可能如下所示:

(伪SQL)

Create table ContactName (
       CONTACT_ID integer not null default auto_increment,
       etc
       )

CREATE TABLE TELECOM_CLASSES (
    CLASS_ID INTEGER NOT NULL DEFAULT AUTO_INCREMENT,
    CLASS_NAME VARCHAR(200) NOT NULL 
              CHECK (CLASS_NAME  IN ('email','tel','fax',etc)),
    etc
     );

CREATE TABLE CONTACT_TELECOMS (
    TELECOM_ID INTEGER NOT NULL DEFAULT AUTO_INCREMENT,
    CONTACT_ID INTEGER NOT NULL REFERENCES CONTACTNAME (CONTACT_ID),
    CLASS_ID INTEGER NOT NULL REFERENCES TELECOMS_CLASSES (CLASS_ID),
    TELECOM VARCHAR(200) NOT NULL,
    etc

);