我第一次决定切换到 InnoDB 并尝试使用外键和其他 InnoDB 功能。
创建关系时,我应该只在一张表上声明它们吗?还是两个表?
例如,对于以下每种情况,您将在何处以及如何声明关系?
- 1 用户有很多小部件
- widget 属于 1 个用户(和上面一样吗?)
- 1 位用户有 1 个小部件
- 用户[多对多]小部件
- 许多用户共享 1 个小部件
这些只是一些随机的例子,我只是想了解应该声明哪些方向的关系。
另外,同理,“ON CASCADE”的工作方向是什么?
谢谢
最佳答案
- 1 用户有很多小部件
假设一个小部件是一个用户专有的(因为您有一个单独的多对多点):表 widget
上的 user_id
引用 上的主键>用户
- 小部件属于 1 个用户
见上文。
- 1 位用户有 1 个小部件
user
表中的 widget_id
引用 widget
表上的主键,在 widget_id
上具有唯一索引,或者反过来,其实并不重要。如果是 1 对 1 而不是 0 或 1 对 1 的关系,您应该考虑将 widget 和 user 放在一个表中。
- 用户[多对多]小部件
引入第三个表,user_widget
,其中有 2 个字段 user_id
和 widget_id
引用 user 和 widget 表中相应的主键。
- 许多用户共享 1 个小部件
与“1 个用户有 1 个小部件”相同,但 widget_id
上没有唯一索引
ON CASCADE
选项适用于从父项(主键)到子项(外键/引用)。因此,如果您在第一个场景中有一个 ON DELETE CASCADE
(一个用户有很多小部件),删除用户会删除他的所有小部件,但删除所有小部件不会删除用户。
关于mysql - InnoDB 关系 : one-way or two-way?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7147224/