使用外键跟踪新关系中的所有权

Posted

技术标签:

【中文标题】使用外键跟踪新关系中的所有权【英文标题】:Keeping track of ownership in a new relation using foriegn keys 【发布时间】:2014-01-19 13:22:42 【问题描述】:

我想跟踪哪些用户拥有哪些歌曲。 用户表:

+--------+----+
|username|name|
+--------+----+
|sam1    |Sam |
+--------+----+
|bil9    |Bil |
+--------+----+
|tomj    |Tom |
+--------+----+

逻辑是创建一个新关系来跟踪谁拥有什么歌曲...

+-------------+--------+
|user_username|track_id|
+-------------+--------+
|sam1         |1       |
+-------------+--------+
|bil9         |5       |
+-------------+--------+
|bil9         |9       |
+-------------+--------+
|tomj         |2       |
+-------------+--------+

Track id 是tracks 表的外键:

+--+------+
|id|name  |
+--+------+
|0 |track1|
+--+------+
|1 |track2|
+--+------+

这是正确的,还是有更合乎逻辑的方法?

【问题讨论】:

如果您的意图是为多对多关系建模,那么是的 - 使用联结表是正确的做法。 【参考方案1】:

你所说的“逻辑”更像是一个查找表。

需要考虑的事项:

1 个用户可以拥有多个曲目?如果是这样,请确保 track_id 不是唯一的。 您所做的很好,因为如果您更改曲目或用户名,映射将保持不变。

我建议的一件事是拥有一个用户 ID,以便 user_id 映射到 track_id - 将数字映射到数字总是好的,因为它通常可以更快地进行查询,然后您可以随意更改文本值,并且他们仍然映射。

【讨论】:

根据表格的布局方式,track_id 是唯一的不是更有意义吗? bil9 拥有 9 和 5。这些 id 中的每一个都可以映射到特定的轨道。此外,这个问题暗示 id 本身就是轨道表的主键。

以上是关于使用外键跟踪新关系中的所有权的主要内容,如果未能解决你的问题,请参考以下文章

清除表中的所有行,将标识规范重置为零并且不影响外键?

按 foreignKey 关系中的字段过滤

如何使用 Graphene-Django Relay 中的外键关系更新模型?

如何为访问控制和跟踪创建数据库设计?

使用 inotify 跟踪系统中的所有文件

暂时禁用所有外键约束