mysql - InnoDB 关系 : one-way or two-way?

标签 mysql sql database foreign-keys innodb

我第一次决定切换到 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_idwidget_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/

相关文章:

mysql - 在存储过程中使用 LIKE 并同时转义注入(inject)

MySQL 似乎无法连接空字段

mysql - 哪个更好,(1 个数据库 + 4 个表)或(2 个数据库 + 每个 2 个表)?

php - 使用php将图像添加到mysql

mySQL - 在单个表中选择日期范围重叠

php - MySQL PDO 错误 : SQLSTATE[21S01]: Insert value list does not match column list: 1136 Column count doesn't match value count at row 1

database - Access 2010查询执行崩溃

java - 每5秒用java扫描一个表sql

mysql - 从单个查询更新大表时,SQL NOW() 函数是动态的还是静态的?

c# - 为什么 Entity Framework 不让 SQL Server 生成主键?