Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.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
Mysql 在列的唯一组合上进行PK或添加数字rowID_Mysql_Sql - Fatal编程技术网

Mysql 在列的唯一组合上进行PK或添加数字rowID

Mysql 在列的唯一组合上进行PK或添加数字rowID,mysql,sql,Mysql,Sql,这与其说是编程问题,不如说是设计问题 我有一个表,用于存储有关零售产品的详细信息: Name Barcode BarcodeFormat etc... ---------------------------------------- 名称、条形码、条形码格式三列将唯一标识表候选键中的记录。但是,我还有其他表需要在这个表上使用FK。因此,我引入了一个自动递增的列itemId,并使其成为PK 我的问题是-我应该将PK设置为itemId、名称、条形码、条形码格式,还是最好设置PKit

这与其说是编程问题,不如说是设计问题

我有一个表,用于存储有关零售产品的详细信息:

Name    Barcode    BarcodeFormat  etc...
---------------------------------------- 
名称、条形码、条形码格式三列将唯一标识表候选键中的记录。但是,我还有其他表需要在这个表上使用FK。因此,我引入了一个自动递增的列itemId,并使其成为PK

我的问题是-我应该将PK设置为itemId、名称、条形码、条形码格式,还是最好设置PKitemId和UNIQUEName、条形码、条形码格式

我主要关心的是插入和选择操作的性能,但也欢迎对大小发表评论


我将innodb表与mysql一起使用:PKitemId和UNIQUEName、条形码、条形码格式

您不想为所有连接等使用多部分密钥带来麻烦 有一天,您可能会有没有条形码值的行,这将是不唯一的,因此您不希望将唯一性硬连接到您的模型中,您可以轻松删除唯一性,而不会破坏任何关系等 唯一性约束是业务级别的问题,而不是数据库实体问题:您总是需要一个键,但可能并不总是需要唯一性的业务规则
绝对:PKitemId和UNIQUEName、条形码、条形码格式

您不想为所有连接等使用多部分密钥带来麻烦 有一天,您可能会有没有条形码值的行,这将是不唯一的,因此您不希望将唯一性硬连接到您的模型中,您可以轻松删除唯一性,而不会破坏任何关系等 唯一性约束是业务级别的问题,而不是数据库实体问题:您总是需要一个键,但可能并不总是需要唯一性的业务规则
除非您有数以百万计的产品或非常高的吞吐量要求,否则在性能方面不会有太大的差异


我倾向于使用代理PK,即自动递增列,这是PKitemId和UNIQUEName、条形码、条形码格式的第二个选项,因为如果业务密钥发生变化,这将更容易管理。

除非您有数百万个产品,或非常高的吞吐量要求,否则在性能方面不会有太大差异


我的偏好是有一个代理PK,即自动递增列,您的PKitemId和UNIQUEName、Barcode、Barcode格式的第二个选项,因为如果业务密钥发生变化,这更容易管理。

如果您已经添加了一个itemId,那么您应该使用该列作为PK,并使其他三列具有唯一性


如果您没有itemId,那么您可以使用其他列作为PK,但可能很难将其保存在所有位置。在这种情况下,它不是很好,因为产品应该有一个id,因为它是一个实体,但是如果它只是一个关系,那么没有id列是可以接受的。

如果您已经添加了一个itemId,那么您应该使用它作为主键,并让其他三列具有唯一性

如果您没有itemId,那么您可以使用其他列作为PK,但可能很难将其保存在所有位置。在这种情况下,它不是很好,因为产品应该有一个id,因为它是一个实体,但是如果它只是一个关系,那么没有id列是可以接受的。

您有两个候选键。我们将三列复合键称为“自然键”,在本例中,将自动增量列称为“代理键”。两者都需要唯一的约束,小写“unique”表示数据库级别的逻辑

可选地,可以将一个候选密钥指定为“主密钥”。选择哪个键(如果有)应获得此名称是任意的。当心在这件事上给你明确建议的人

您有两个候选密钥。我们将三列复合键称为“自然键”,在本例中,将自动增量列称为“代理键”。两者都需要唯一的约束,小写“unique”表示数据库级别的逻辑


可选地,可以将一个候选密钥指定为“主密钥”。选择哪个键(如果有)应获得此名称是任意的。当心在这件事上给你明确建议的人

-1“主键”的选择是任意的。您的最后一点特别令人困惑:完整性约束应该是业务规则数据库中的逻辑表示;如果他们没有,那你就大错特错了@有一天你完全没有领会我的意思。独特的组合是一个以业务为中心的概念,因此随着业务需求的变化随时可能发生变化,正如我举的没有条形码的产品的完全合理的例子一样,这将打破独特的限制。但是,对主键的需求是永久性的,因此可能会超过对唯一约束的需求。通过将两者分离,您可以构建灵活性和可维护性。通过合并这两者,可以锁定数据库请求
根据目前的业务要求,您最好希望业务不会发生变化。谢谢您的进一步评论,但他们确认我没有遗漏您的观点,我的立场不变。我认为业务规则可以更改,但数据库约束将保持不变的想法是错误的。@有一天,我不想在这里感到痛苦,但你仍然不明白。让我用sql为您表达它。比较如果业务发生变化,不再需要唯一列组合时会发生什么:使用单独的键和索引,您可以删除索引MY_unique_index,而不必更改任何代码或数据库。但是,如果你使用unique列作为键,一切都将中断-你必须重写应用程序代码并在db中重新处理FK关系,你必须放入一个新的键列,这就是我现在的解决方案!如果企业与另一个也在自动增量列上单独键入产品的企业合并,并且发生冲突,会发生什么情况?如果他们都输入了产品或其他行业标准标识符,那么这个问题就不会出现。事实上,这两个参数都很简单,因为,-1“主键”的选择是任意的。您的最后一点特别令人困惑:完整性约束应该是业务规则数据库中的逻辑表示;如果他们没有,那你就大错特错了@有一天你完全没有领会我的意思。独特的组合是一个以业务为中心的概念,因此随着业务需求的变化随时可能发生变化,正如我举的没有条形码的产品的完全合理的例子一样,这将打破独特的限制。但是,对主键的需求是永久性的,因此可能会超过对唯一约束的需求。通过将两者分离,您可以构建灵活性和可维护性。通过将两者合并,您可以将数据库需求锁定为当前的业务需求。您最好希望业务不会改变。谢谢您的进一步评论,但他们确认我没有遗漏您的观点,我的立场保持不变。我认为业务规则可以更改,但数据库约束将保持不变的想法是错误的。@有一天,我不想在这里感到痛苦,但你仍然不明白。让我用sql为您表达它。比较如果业务发生变化,不再需要唯一列组合时会发生什么:使用单独的键和索引,您可以删除索引MY_unique_index,而不必更改任何代码或数据库。但是,如果你使用unique列作为键,一切都将中断-你必须重写应用程序代码并在db中重新处理FK关系,你必须放入一个新的键列,这就是我现在的解决方案!如果企业与另一个也在自动增量列上单独键入产品的企业合并,并且发生冲突,会发生什么情况?如果他们都输入了产品或其他行业标准标识符,那么这个问题就不会出现。事实上,这两个都是卑鄙的论点,因为,当然。