Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何确定什么应该是主键?_Sql_Mysql_Database Design - Fatal编程技术网

Sql 如何确定什么应该是主键?

Sql 如何确定什么应该是主键?,sql,mysql,database-design,Sql,Mysql,Database Design,这是一个相当普遍的问题,但我想知道在确定表的主键时使用了什么。非常需要与您一起提供的示例 我注意到许多程序员添加了ID列并将其用作主键。我认为,从设计的角度来看,它是有缺陷的,因为在这种情况下ID与表无关。主键的作用是唯一地标识表中的每一行。如果没有一列或一组列符合此要求,则通常会添加一个包含唯一id的列作为主键 我不同意您关于程序员添加与表数据无关的id的评论。当需要跨多个表链接数据时,简洁的id比复合键更容易使用 主键应始终是与数据无关的自动递增整数 编辑以添加guid也很好。重要的是,密钥

这是一个相当普遍的问题,但我想知道在确定表的主键时使用了什么。非常需要与您一起提供的示例


我注意到许多程序员添加了ID列并将其用作主键。我认为,从设计的角度来看,它是有缺陷的,因为在这种情况下ID与表无关。

主键的作用是唯一地标识表中的每一行。如果没有一列或一组列符合此要求,则通常会添加一个包含唯一id的列作为主键


我不同意您关于程序员添加与表数据无关的id的评论。当需要跨多个表链接数据时,简洁的id比复合键更容易使用

主键应始终是与数据无关的自动递增整数

编辑以添加guid也很好。重要的是,密钥并不描述您的数据,因此,如果您的数据发生变化,您的PK也不会发生变化。始终使用ID字段


假设您使用电子邮件作为主键,然后用户更改其电子邮件地址。然后,您必须将该更改级联到每个联接表中。使用真实数据作为PK没有意义

。。。我的最爱之一。

键应该是一列,其中每个条目都保证是唯一的。例如,社会保险号码或驾照号码。理论上,可以将多个列绑定到一个复合键中。所以,也许名字和出生日期在一起是独一无二的,所以它们可能是一把钥匙。然而在实践中没有人这样做,因为交叉桌子是一种痛苦。最好的解决方案通常是添加一个自动递增的值或GUID列

您可以选择任何您知道将是唯一值的内容,最好是数字内容,如客户ID或帐号。尽可能远离基于字符串的键。如果没有其他问题,请使用GUID值或自动递增整数。

您当然先在Google上搜索过,对吗?我看到,为我弹出的带有主键正确定义的第一个结果也包含示例



  • 等等。

    主键不一定是单个列,也可以是列的组合。如前所述,它的目的是唯一地标识每一行


    出于性能原因,最好使用一个小键,但根据系统的需要,所使用的键的类型可能会有很大的不同。

    好的,在我们使用(和我设计的)的一个系统中,每个用户都有一个自动递增的主键作为其ID。与该特定用户相关的其他表使用其ID作为其主键(虽然显然不是自动递增的),但如果使用正确,它确实是有意义的。

    理论上,可以使用任何唯一的字段(例如社会保险号、url等),但在实践中,我不认为使用自动生成的ID有任何大的缺点。例如,某些奇怪的错误会导致重复的SSN,这可能会对您的数据造成灾难性的影响。

    我确定主键的思考过程如下所示

    “此表中的一条记录将表示…”

    “对于列X、列Y、列Z的不同值,表中应该只有一行”,列X、Y和Z是什么

    汽车型号表。

    嗯,这个表将存储关于不同类型汽车的信息,制造商名称是否应该是键?不,我可以有许多行来标识来自同一制造商的不同车型。嗯,制造商名称和车型名称是否应该是键?不,我想有不同的行,具有相同的制造商名称和车型名称,但是表中同时列出了不同的发布年份。那么“制造商名称”、“型号名称”和“发布年份”呢

    我有可能同时拥有两行相同的制造商名称、车型名称和发布年份吗?嗯,没有。那没有意义,它们将是相同的车型,我只希望每个车型有一条记录。太好了,这是关键

    此表中的一条记录将代表特定制造商的特定年份的特定型号。我在创建表时决定了这一点,这就是我创建表的原因,如果您无法描述表中的内容以帮助确定您不真正理解创建它的原因的关键

    随着时间的推移发生了可怕的变化!!!(代理键、自然键、缓慢变化的维度)

    啊,但是我存储的关于特定车型的信息(来自特定制造商和发布年份)可能会改变。最初我被告知它有两个门,现在我发现它有四个门,我希望在我的表中有正确的信息,但不要丢失旧记录,因为人们已经报告了它,我需要能够重现他们以前的结果

    好的,我将添加一个新列“MODEL_ID”,并使其成为表的主键,这样我就可以存储具有相同型号名称、制造商名称和发布年份的多个记录。我还将添加一个有效的时间戳

    这可以很好地工作,事实上,在我的更改中,表的主键现在是MODEL_ID,一个代理键。但是自然键、业务键、“在任何时间点”的键仍然是MODEL_Name、Manufacturer_Name和Release_Year,我不能忽视这一点

    关于代理键的注意事项:

    根据定义,代理键对于每一行都是唯一的!代理键有时可以更容易地操作数据,尤其是随时间变化的数据。但代理键无论如何都不能取代自然主键,您仍然需要知道表的“粒度”是什么

    如果我们说澳大利亚的每个人都会被分配一个Stack_Overflow_User_id,那么当Jeff和Joel开始给Stack_Overflow时我们会怎么做