我正在为学生设计一个数据库。瑞士的计算机科学专业的学生可以在不同的专业之间做出选择,例如应用程序开发、系统工程等。
本申请中也有来自其他专业的学生,他们没有这个专业。几个例子:
+--------------------+-------------------------+
| Profession | Specialization |
+--------------------+-------------------------+
| Computer scientist | |
| | Application development |
| | System engineering |
| | Support |
| | |
| Electrician | |
| | none |
| | |
| Janitor | |
| | none |
| | |
| Architect | |
| | Small buildings |
| | High buildings |
| | |
+--------------------+-------------------------+
我希望你明白了。我现在的问题是,我该如何设计具有这些属性的数据库表,因为它们相互依赖?每个用户都有自己的职业,有些用户根据自己的职业没有专业化。所以电工不应该是应用程序开发人员,也不应该是架构师。
到目前为止我的想法 1
+-----------------------------+
| User |
+-----------------------------+
| #id |
| profession_id |
| specialisazion_id, nullable |
+-----------------------------+
通过约束检查执行逻辑
方法二
+-------------------+ +----------------+ +------------+
| User | | Specialization | | Profession |
+-------------------+ +----------------+ +------------+
| #id | +--| #id | +--| #id |
| username | | | name | | | name |
| specialization_id |--+ | profession_id |--+ +------------+
+-------------------+ +----------------+
自己管理逻辑并确保每个没有专业化的职业都有一个专业化条目。
方法三
+----------------+ +-----------------------------+ +------------+
| Specialization | | spec_prof | | Profession |
+----------------+ +-----------------------------+ +------------+
| #id |--+ | #id | +--| #id |
| name | +--| specialization_id, nullable | | | name |
+----------------+ | profession_id |--+ +------------+
+-----------------------------+
|
|
+--------------+ |
| User | |
+--------------+ |
| #id | |
| username | |
| spec_prof_id |--+
+--------------+
不知何故,所有不同的方法都让人觉得笨拙、肮脏。支持和反对不同方法的论据是什么?有没有更好的办法?
我什至如何搜索这个问题?dependent命名正确吗?
任何帮助是极大的赞赏。
我将使用一个表来表示专业,并使用一个相关表来表示专业化。
一些示例数据:
专业及其相关专业:
结果:
如果您的用户只能有一个职业,我会创建一个这样的用户表:
检查约束确保只能添加有效的职业和专业化,但代价是需要“重复”
ProfessionID
的专业化列。然后插入用户如下所示:
查看具有职业和专长的用户如下所示:
尝试插入无效数据如下所示:
如果我需要支持多个职业的用户,我会使用交叉引用表,如下所示:
插入数据:
查询数据:
结果:
再一次,适当的约束可以防止无效的职业/专业化组合:
这也将支持具有专业但没有专业化的用户:
您可以使用单个表层次结构保持简单,它也允许多个“专业化”。
我认为这就是你的方法 1。
现在您可以使用递归 CTE 查询它。
这种形式的优点是你可以添加一个新的进一步的“专业化”,它就会起作用......例如,
它会起作用..
现在您可以看到
The Gods
是 的进一步特化Computer scientists
,并且PostgreSQL DBAs
是它们的子集。