mysql - 您可以对 MySQL 或任何数据库中的外键没有或弱约束吗?
问题描述
我知道大多数数据库将外键约束设置为“SET NULL”、“CASCADE”、“NO ACTION”或“RESTRICT”。默认值通常是 No Action,这意味着删除操作将被回滚。
如果我想要一个“松散”或“弱”的参考怎么办?也就是说,如果链接存在,那就太好了!如果没有,谁在乎,让它打破!
我在尝试为健身应用程序设计我的第一个数据库时遇到了这个问题,该应用程序包含许多用户创建的自定义练习。任何其他用户都可以使用这些自定义练习。
比如说:
- 用户 A 创建练习 A。
- 用户 B 记录练习 A。
- 用户 A 删除了练习 A。
- UserB 保留ExerciseA 的日志,但不能引用ExerciseA 本身,因为它已被删除。
这种情况类似于可以删除视频的 Youtube 播放列表,它将显示为断开的链接 - 这是预期的行为。不需要参照完整性。播放列表的项目本身存在并需要父视频,但该视频不再存在。
“On delete set null”似乎是这里的最佳选择,但我需要将ExerciseID 保留在Log 表中,因为它用作复合键的一部分(练习日志由UserID、ExerciseID 和时间戳唯一标识)。不要完全使用外键和约束?我不知道这里的最佳做法是什么。帮助!
解决方案
经过一番研究,简短的回答是“不”。如果不强制执行其引用完整性,就不能拥有外键。它首先破坏了拥有外键的整个目的,该外键管理着一条信息必须存在于数据库中的规则。
好吧,我不想要参照完整性,所以我不需要外键!我什至会说并非所有关系都需要参照完整性。一本好书让我对这个概念放心:https ://ardalis.com/related-data-without-foreign-keys/
推荐阅读
- jquery - jquery 函数在单击事件中无法正常工作
- c - 为什么我的 CUDA 内核似乎什么都不做?
- python - libgssapi_krb5.so.2:无法打开共享对象文件:没有这样的文件或目录
- python - 文件路径和文件名中的“Ü”等德语特殊字符 - 无法将路径用作字符串
- scala - 为什么 scala Try-match 匹配 Throwable 为成功
- json - TableView的无限滚动分页
- python - 更改 python 版本后找不到模块错误
- python - 从元组列表中查找最近的元组 - Python
- c# - # 后打开带有参数的本地 html 文件
- php - Laravel 不在代码文件夹中创建项目