我想了解在代码中管理数据库一致性的优点/缺点,而不是使用SQL功能。
只是解释一下: 一致性意味着如果我有用户,并且每个用户都有专辑并且每个专辑都有图像,则删除用户意味着删除(或软删除)所有专辑和图像。这也可能意味着在每个用户和每个专辑的主键上都有连续ID的图像。
在代码中意味着在我的框架代码中使用“on inserted,deleted,updated”事件(例如Eloquent)
sql功能意味着使用级联,触发器等。
人们抱怨这是基于意见的,但事实并非如此。如果使用mysql shell,那么仅应用代码规则并且没有约束可能会导致不一致 - 这是事实。 此外,如果某人有最佳实践和参考资料的链接,那也很好,我真的很想知道谷歌的开发人员做了什么 - 例如again.not.opinions.but.facts。
编辑:拼写,格式化,根据事实的问题措辞重新开启。
答案 0 :(得分:2)
这取决于,但在这里你有一些想法:
JordiMartínez
答案 1 :(得分:2)
由于您使用laravel以及mysql标记了此问题,因此我将为您提供支持Laravel开发风格的答案。 Laravel通过Artisan支持Eloquent ORM和数据库迁移。这将允许您在代码中保持这种“一致性”,而不是严格地在DB上。
有大量资源可用于了解ORM是什么以及它是如何工作的。 Laravel使用Eloquent并允许您为模型及其元素强制执行关系和规则。
使用migrations我们可以使用我们的模型构建我们的数据库,同时在大多数数据库(MySQL与Postgres)之间保持可移植性。
由多个开发人员开发的应用程序需要一种保持同步的方法。如果一个开发人员决定添加具有某些约束的表,则需要将其传达给团队的其他成员。直接向数据库添加规则可能会在与其他团队成员通信时导致问题并且会引起麻烦。相反,使用迁移和ORM来描述正在改变的内容以及原因。迁移将允许任何其他开发人员简单地将他们的数据库“迁移”到最新版本并保持同步。
将点数与其他一些列出的答案进行比较:
答案 2 :(得分:1)
这是一个备受争议的话题。与大多数其他开发者一样,我有完全不同的观点(如上所示)。它仍然值得一试:
我将始终管理应用程序代码中所有数据的一致性,并且不使用外键或其他约束。
原因如下:
一个代码位置。我的所有逻辑应该在一个地方。如果你将逻辑分布在多个地方,开发人员将来往往会忘记它们,这将严重削弱数据库的一致性。同样的原因,我将永远不会有存储过程btw。
应用程序中仍然需要如果在数据库中进行一致性检查,您仍然必须在应用程序中检查相同的约束。您需要这样做以允许应用程序向用户显示错误的错误并强制执行逻辑约束。所以如果你还需要它们,为什么要再次在db中复制相同的规则呢?这导致冗余逻辑,导致容易被遗忘的逻辑,导致瘫痪的一致性。
非常不切实际曾经尝试过数据库转储然后将其重新导入数据库吗?你会很难过的。表通常在导入期间违反约束,不同的系统不允许在导入期间忽略约束。通过数据库工具动态管理数据也可能是一个严重的痛苦。因此,它会严重影响您的管理员表现。
是的,无论如何都可能有理由使用约束,但如果它们可以超过三点,它们必须是非常强大的理由。
答案 3 :(得分:0)
通常,最好使用像cascade这样的外键约束。它简单,高效且一致。
您的相册表上有类似的内容
FOREIGN KEY (uid) REFERENCES User(id)
ON DELETE CASCADE
一旦删除User表中的“id”行,这将删除Album表中引用用户表中特定“id”的所有条目。