Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/238.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.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
Php 不使用sql外键的缺点_Php_Mysql_Sql_Database_Magento - Fatal编程技术网

Php 不使用sql外键的缺点

Php 不使用sql外键的缺点,php,mysql,sql,database,magento,Php,Mysql,Sql,Database,Magento,我有一个Magento商店(使用MySql数据库),刚刚注意到一些开发人员引入了一个自定义数据库来捕获一些结构化数据 现在我注意到表之间没有通过外键链接,只是添加了一列,例如priceListID=01124,它与价目表上的Id相同。因此,必须在代码中通过触发不同的select语句将数据链接在一起 现在我想知道这是否需要尽快修复,或者不使用db级别的外键将数据链接在一起是否真的可以? 这样做的缺点是什么?是否有一些好处(比如灵活性?) 希望你能帮我这个忙!非常感谢 从您的描述中,我了解到表在功能

我有一个Magento商店(使用MySql数据库),刚刚注意到一些开发人员引入了一个自定义数据库来捕获一些结构化数据

现在我注意到表之间没有通过外键链接,只是添加了一列,例如
priceListID=01124
,它与价目表上的
Id
相同。因此,必须在代码中通过触发不同的select语句将数据链接在一起

现在我想知道这是否需要尽快修复,或者不使用db级别的外键将数据链接在一起是否真的可以? 这样做的缺点是什么?是否有一些好处(比如灵活性?)


希望你能帮我这个忙!非常感谢

从您的描述中,我了解到表在功能上确实是相关的,因为它们共享一条公共信息(新表中的
priceListID
与原始表中的
id
相关)。一方面,这种设置仍然允许编写将表连接在一起的查询

但是,不创建外键来表示该关系的缺点是,从数据库的角度来看,无法保证该关系的一致性。例如,可能会在新表中创建记录,而原始表中不存在
priceListID
。当新表中存在相关记录时,也可以删除旧表中的记录,从而将子表变成孤儿

结论是:通过不使用外键,开发人员完全依赖应用程序来维护数据完整性。不使用RDBMS提供的内置功能来保护数据一致性没有明显的好处,开发人员很可能忘记了表定义的关键部分。我建议与他们交谈,并与他们亲密接触,以创建丢失的外键(除非他们能够清楚地解释为什么没有)

这应该简单到:

ALTER TABLE newtable
    ADD CONSTRAINT fk_new_to_original_fk 
    FOREIGN KEY (priceListID ) 
    REFERENCES originaltable(id);

请注意,这要求引用列中的所有值在父表中可用。

从您的描述中,我了解到表确实是功能相关的,因为它们共享一条公共信息(
priceListID
在新表中与
id
在原始表中相关)。一方面,这种设置仍然允许编写将表连接在一起的查询

但是,不创建外键来表示该关系的缺点是,从数据库的角度来看,无法保证该关系的一致性。例如,可能会在新表中创建记录,而原始表中不存在
priceListID
。当新表中存在相关记录时,也可以删除旧表中的记录,从而将子表变成孤儿

结论是:通过不使用外键,开发人员完全依赖应用程序来维护数据完整性。不使用RDBMS提供的内置功能来保护数据一致性没有明显的好处,开发人员很可能忘记了表定义的关键部分。我建议与他们交谈,并与他们亲密接触,以创建丢失的外键(除非他们能够清楚地解释为什么没有)

这应该简单到:

ALTER TABLE newtable
    ADD CONSTRAINT fk_new_to_original_fk 
    FOREIGN KEY (priceListID ) 
    REFERENCES originaltable(id);

请注意,这要求referencing列中的所有值在父表中可用。

将此类约束保留在数据库中没有什么好处:

  • 表演。如果将大多数约束(如外键)存储在靠近数据的数据库中,则可以更好地实现这些约束。是否要使用其他
    选项检查数据完整性?您必须向数据库发出额外请求。这需要一些时间
  • 如果您有多个与数据库一起工作的应用程序,该怎么办?您必须编写代码来检查所有数据库中的数据完整性,这意味着额外的费用
  • 同步。当您使用附加select检查数据完整性时,其他用户可能会同时删除此数据。你不会知道的。当然,这些检查可以正确执行,但这仍然是您必须做的额外工作

  • 对我来说,这是一种糟糕的、不可扩展的设计,会带来很多问题。数据完整性是构建数据库的目的。而且这些类型的验证应该保留在数据库中。

    将这些约束保留在数据库中没有什么好处:

  • 表演。如果将大多数约束(如外键)存储在靠近数据的数据库中,则可以更好地实现这些约束。是否要使用其他
    选项检查数据完整性?您必须向数据库发出额外请求。这需要一些时间
  • 如果您有多个与数据库一起工作的应用程序,该怎么办?您必须编写代码来检查所有数据库中的数据完整性,这意味着额外的费用
  • 同步。当您使用附加select检查数据完整性时,其他用户可能会同时删除此数据。你不会知道的。当然,这些检查可以正确执行,但这仍然是您必须做的额外工作

  • 对我来说,这是一种糟糕的、不可扩展的设计,会带来很多问题。数据完整性是构建数据库的目的。这些类型的验证应该留在数据库中。

    外键有助于数据完整性,但它们不是绝对必要的。如果你关心完整性,考虑添加它们。外键有助于数据完整性,但它们不是绝对必要的。如果你关心完整性,考虑添加它们。谢谢简略解释!添加这些外键需要很多工作吗?现在真的有可能吗