关系数据库设计(MySQL)
Posted
技术标签:
【中文标题】关系数据库设计(MySQL)【英文标题】:Relational Database Design (MySQL) 【发布时间】:2010-12-02 13:46:59 【问题描述】:我现在正在为基于“人才”的应用程序设计我的数据库,例如:
型号 演员 歌手 舞者 音乐家我昨天提出了一个类似的问题,并从回复中取得了一些进展,但我认为现在开始一个新问题会更容易。所以这就是我目前所拥有的:
Table talent:
- id
- name
Table subtalent:
- id
- name
- talent_id (FK)
Table user:
- id
- name
在该网站上注册的任何用户都可以为这些人才中的一个或多个创建个人资料。人才可以有子人才,例如演员可以是电视演员、戏剧演员或配音演员。
现在我需要知道以下问题的答案:
1) 我应该如何存储用户拥有的天赋和副天赋。我假设还需要两个表(talent_user 和 subtalent_user)?
2) 用户可以指定他们拥有的每个 TOP LEVEL 人才的具体信息。每个人才的字段会有所不同,所以我认为这需要另一组表格?以及这些如何与用户记录相关联,即外键是什么?
【问题讨论】:
【参考方案1】:您是否需要拥有一个子人才的子人才? IE。在某些情况下,您有许多不同级别的才能,父才能有子才能,但父级是另一个才能的子才能。哇,好啰嗦! :)
在这种情况下,您将使用自引用表。如下所示
Table:Talents
- TalentID
- ParentTalentID (References TalentID column, NULL if this Talent is a top level)
- Name
然后,您可以拥有任意数量的类别和子类别。
然后您需要一个连接表,因为一个用户可以有很多才能,而一个才能可以属于多个用户。
Table:UserTalents
- TalentID (Fk)
- UserID (Fk)
Table:Users
- UserID (Pk)
- Name
【讨论】:
【参考方案2】:1) 我同意。
Table talent_user:
- id
- user_id
- talent_id
Table subtalent_user:
- id
- user_id
- subtalent_id
2) 我认为这个问题的答案取决于几个因素。如果您确切地知道不同天赋的不同形式是什么,我会保持简单(如“不要想得太难”)并为您将拥有的每种不同类型的形式创建一个表格。否则,您可能希望所有表单都只有一个表,并将表单数据另存为 XML。这样您就可以保留原始表单的结构,而无需过于复杂的数据库架构。
【讨论】:
【参考方案3】:放弃潜质。 Talent是一个分层的天赋——(ParentTalent字段)。允许任意深度。
您需要一个将用户链接到人才表中的条目的 UserTalent 表。
【讨论】:
+1 这就是我昨天告诉他的 =D ***.com/questions/4325161/… 关系数据库不能很好地处理分层属性:很难获得闭包。如果您事先知道级别数,请直接在数据库中使用。 所以如果我有一个单独的人才表来存储***人才和子人才,那么我如何确定哪个是哪个? IE。是否需要一个“类型”字段,或者例如,如果我只想检索***人才,我是否要搜索 parent_id = null 的记录? 过去我曾大量使用分层数据,我同意 Colin 的观点。无论关系型数据库是否能很好地处理分层数据,您都应该选择最简单的解决方案,尤其是在您没有丰富经验的情况下,硬编码两个级别的人才是最简单的解决方案。 Jason/Colin - 那么你对我的第一个问题有什么建议吗?【参考方案4】:2) 也许您可以使用 Talent_feature 表。这样您就可以列出每个人才的特点。
Feature = (id, name, description)
talent_feature = (id, talent_id, feature_id)
然后您将拥有一个 User_talent_feature,例如:
user_talent_feature = (user_id, talent_feature_id, possible_further_fields)
这在为人才添加新功能方面提供了很大的灵活性。
1) 要么你可以让每个人才都有一个潜质,这样关系就永远是潜质的。所以你永远不会有一个人只是一个演员,而是一个 tv_actor 或 Broadway_actor 等。然后你将只需要 user_subtalent 关系。你总能从中找到顶尖的人才。或者您可以使用其他答案提出的层次结构。
【讨论】:
以上是关于关系数据库设计(MySQL)的主要内容,如果未能解决你的问题,请参考以下文章