Php 不使用sql外键的缺点
我有一个Magento商店(使用MySql数据库),刚刚注意到一些开发人员引入了一个自定义数据库来捕获一些结构化数据 现在我注意到表之间没有通过外键链接,只是添加了一列,例如Php 不使用sql外键的缺点,php,mysql,sql,database,magento,Php,Mysql,Sql,Database,Magento,我有一个Magento商店(使用MySql数据库),刚刚注意到一些开发人员引入了一个自定义数据库来捕获一些结构化数据 现在我注意到表之间没有通过外键链接,只是添加了一列,例如priceListID=01124,它与价目表上的Id相同。因此,必须在代码中通过触发不同的select语句将数据链接在一起 现在我想知道这是否需要尽快修复,或者不使用db级别的外键将数据链接在一起是否真的可以? 这样做的缺点是什么?是否有一些好处(比如灵活性?) 希望你能帮我这个忙!非常感谢 从您的描述中,我了解到表在功能
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列中的所有值在父表中可用。将此类约束保留在数据库中没有什么好处:
选项检查数据完整性?您必须向数据库发出额外请求。这需要一些时间
对我来说,这是一种糟糕的、不可扩展的设计,会带来很多问题。数据完整性是构建数据库的目的。而且这些类型的验证应该保留在数据库中。将这些约束保留在数据库中没有什么好处:
选项检查数据完整性?您必须向数据库发出额外请求。这需要一些时间
对我来说,这是一种糟糕的、不可扩展的设计,会带来很多问题。数据完整性是构建数据库的目的。这些类型的验证应该留在数据库中。外键有助于数据完整性,但它们不是绝对必要的。如果你关心完整性,考虑添加它们。外键有助于数据完整性,但它们不是绝对必要的。如果你关心完整性,考虑添加它们。谢谢简略解释!添加这些外键需要很多工作吗?现在真的有可能吗