在哪些表中存储关系 ID 以进行连接(最好 practice/efficiency)

Which tables to store relational IDs in for joins (for best practice/efficiency)

我是一名开发人员,对数据库架构的经验有限。我刚开始粗略考虑 rethinkdb 的数据库应该是什么样子,我想出了这样的东西:

我想到加入数据的 ID 可以放在几个不同的地方:

什么是最好的practice/more效率?

我的猜测是这样做更有效率:

尤其是在所有项目中可能有大量语言条目的情况下,我的假设是遍历所有项目以寻找匹配的语言 ID 会很慢。

这实际上不是效率问题,它属于逻辑和物理数据建模的范畴。应该创建关系数据库,以便它可以适应现实世界的情况(例如汽车制造商有多种车型),但也应该受到约束,以防止现实世界中不存在的任何情况(例如汽车模型有两个制造商)。

根据对现实世界情况的理解,这里有一些逻辑可以遵循。

  1. 如果一种语言只能有一个项目,但一个项目可以有多种语言,那么将 project_id 放在语言上。 language belongs_to projectproject has_many languages
  2. 如果一种语言可以有多个项目,但一个项目只能有一种语言,那么将 language_id 放在项目上。 language has_many projectsproject has_many languages
  3. 如果一种语言可以有很多项目,一个项目可以有很多语言,然后创建一个新的 project_language 模型,其中包含两个 ID。 language has_many projects through project_languagesproject has_many languages through project_languages

我怀疑用户和项目属于第三类,所以你需要中间table,它也可以存储权限。

通过正确的关联、作用域等,您将能够实现 @user.projects@project.users@project.languages@user.project_languages - @user.languages[=20 等魔法=]