在哪些表中存储关系 ID 以进行连接(最好 practice/efficiency)
Which tables to store relational IDs in for joins (for best practice/efficiency)
我是一名开发人员,对数据库架构的经验有限。我刚开始粗略考虑 rethinkdb 的数据库应该是什么样子,我想出了这样的东西:
用户
- 项目 ID(包括访问级别)
- ...
项目
- 或者这应该有用户 ID(和访问级别)?
- 语言 ID(1 到多个)
- ...
语言
- 或者这应该有项目 ID?
- ...
语言输入
- 语言 ID
- .....
我想到加入数据的 ID 可以放在几个不同的地方:
- 用户应该拥有他们所属的项目和访问级别等其他数据,还是项目应该拥有用户?
- 项目应该包含语言 ID,还是语言应该包含项目 ID?
什么是最好的practice/more效率?
我的猜测是这样做更有效率:
- 用户访问站点,我们知道项目 ID,因此可以抓取它们
- 项目 ID 知道语言 ID,因此可以获取它们
- 语言知道语言条目 ID,因此可以获取它们
尤其是在所有项目中可能有大量语言条目的情况下,我的假设是遍历所有项目以寻找匹配的语言 ID 会很慢。
这实际上不是效率问题,它属于逻辑和物理数据建模的范畴。应该创建关系数据库,以便它可以适应现实世界的情况(例如汽车制造商有多种车型),但也应该受到约束,以防止现实世界中不存在的任何情况(例如汽车模型有两个制造商)。
根据对现实世界情况的理解,这里有一些逻辑可以遵循。
- 如果一种语言只能有一个项目,但一个项目可以有多种语言,那么将 project_id 放在语言上。
language belongs_to project
和 project has_many languages
- 如果一种语言可以有多个项目,但一个项目只能有一种语言,那么将 language_id 放在项目上。
language has_many projects
和 project has_many languages
- 如果一种语言可以有很多项目,和一个项目可以有很多语言,然后创建一个新的 project_language 模型,其中包含两个 ID。
language has_many projects through project_languages
和 project has_many languages through project_languages
我怀疑用户和项目属于第三类,所以你需要中间table,它也可以存储权限。
通过正确的关联、作用域等,您将能够实现 @user.projects
、@project.users
、@project.languages
、@user.project_languages - @user.languages
[=20 等魔法=]
我是一名开发人员,对数据库架构的经验有限。我刚开始粗略考虑 rethinkdb 的数据库应该是什么样子,我想出了这样的东西:
用户
- 项目 ID(包括访问级别)
- ...
项目
- 或者这应该有用户 ID(和访问级别)?
- 语言 ID(1 到多个)
- ...
语言
- 或者这应该有项目 ID?
- ...
语言输入
- 语言 ID
- .....
我想到加入数据的 ID 可以放在几个不同的地方:
- 用户应该拥有他们所属的项目和访问级别等其他数据,还是项目应该拥有用户?
- 项目应该包含语言 ID,还是语言应该包含项目 ID?
什么是最好的practice/more效率?
我的猜测是这样做更有效率:
- 用户访问站点,我们知道项目 ID,因此可以抓取它们
- 项目 ID 知道语言 ID,因此可以获取它们
- 语言知道语言条目 ID,因此可以获取它们
尤其是在所有项目中可能有大量语言条目的情况下,我的假设是遍历所有项目以寻找匹配的语言 ID 会很慢。
这实际上不是效率问题,它属于逻辑和物理数据建模的范畴。应该创建关系数据库,以便它可以适应现实世界的情况(例如汽车制造商有多种车型),但也应该受到约束,以防止现实世界中不存在的任何情况(例如汽车模型有两个制造商)。
根据对现实世界情况的理解,这里有一些逻辑可以遵循。
- 如果一种语言只能有一个项目,但一个项目可以有多种语言,那么将 project_id 放在语言上。
language belongs_to project
和project has_many languages
- 如果一种语言可以有多个项目,但一个项目只能有一种语言,那么将 language_id 放在项目上。
language has_many projects
和project has_many languages
- 如果一种语言可以有很多项目,和一个项目可以有很多语言,然后创建一个新的 project_language 模型,其中包含两个 ID。
language has_many projects through project_languages
和project has_many languages through project_languages
我怀疑用户和项目属于第三类,所以你需要中间table,它也可以存储权限。
通过正确的关联、作用域等,您将能够实现 @user.projects
、@project.users
、@project.languages
、@user.project_languages - @user.languages
[=20 等魔法=]