首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >关系数据库设计(MySQL)

关系数据库设计(MySQL)
EN

Stack Overflow用户
提问于 2010-12-01 14:07:39
回答 4查看 1.6K关注 0票数 2

我正在为一个基于“人才”的网站启动一个新项目--例如:

  • 模型
  • 演员
  • 歌唱家
  • 舞蹈家
  • 乐师

我建议这样做的方法是,每个人才都有自己的表,并包含一个user_id字段来将记录映射到特定的用户。

任何在网站上注册的用户都可以为这些天赋中的一个或多个创建一个配置文件。一个天才可以有次天赋,例如,一个演员可以是一个电视演员,一个戏剧演员或一个配音演员。

例如,我有用户A-他是一个模特(T型台模型)和一个演员(电视演员,戏剧演员,配音演员)。

我的问题是:

  1. 是否需要创建单独的表来存储此用户的子人才?
  2. 我应该如何为这个用户执行顶级人才的查找?也就是说,在user表中,是否应该有每个人才ID的字段?还是应该在每个顶级人才表中执行查找,以查看是否存在该user_id?
  3. 还有什么我应该知道的吗?
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-12-10 10:11:27

好吧,对不起,答案不对..这是另一种方法。

在我看来,用户可以有多种职业(演员、模特、音乐家等)。通常,我所做的是先在对象中思考,然后将其转换为表。在P.O.O.中,您将有一个类用户和Actor、Model等子类,其中每个子类都可以有诸如TvActor、VoiceOverActor等子类。在DB中,每个人才和子天赋都有一个表,它们都共享相同的主键(用户的id ),因此如果用户4是和Actor和一个模型,则在Actor的表上有一个注册表,在Model上有另一个注册表,这两个注册表都带有id=4

如你所见,储存是很容易的。复杂的部分是检索信息。这是因为数据库没有继承的概念(我认为mysql有,但我还没有尝试)。因此,如果您现在想使用用户4的子类,我会看到三个选项:

  • 为您拥有的每个天赋和子天赋表进行多个选择,询问它们的id是否为4。 选择*从演员在哪里id=4;SELECT *从TvActor在哪里id=4;
  • 在左联接中创建一个大查询,连接所有人才和子人才表。 选择*从用户左加入User.id=Actor.id,左加入TvActor在User.id=TvActor.id左连接.其中User.id=4;
  • 在与用户的NxN关系中创建一个人才表,以存储用户拥有的每个人才和子天赋的引用,因此您不必询问所有的表。您必须对人才表进行查询,以确定在第二个查询中需要询问哪些表。

这三种选择各有优缺点。也许还有一个=)

祝好运

PS:啊,我找到了另一个选项,这里,或者可能是第二个改进的选项

票数 1
EN

Stack Overflow用户

发布于 2010-12-01 14:46:19

在回答你的问题之前..。我认为user_id不应该在人才榜上.这里的主要想法是:“对于一个天赋,你有许多用户,对于一个用户,您有多个天赋”。所以关系应该是NxN,您需要一个中间表

请参阅:多对多

现在

是否需要创建独立的表来存储此用户的子人才?

如果您想做一些动态的事情(添加或删除子人才),您可以使用递归关系。这是一个与其本身相关的表。

代码语言:javascript
运行
复制
TABLE TALENT
-------------
id  PK
label
parent_id PK FK (a foreign key to table Talent)

请参阅:递归关联

我应该如何为这个用户执行顶级人才的查找?也就是说,在user表中,是否应该有每个人才ID的字段?还是应该在每个顶级人才表中执行查找,以查看是否存在该user_id?

如果您以前使用过该模型,那么进行查询可能是一场噩梦,因为您的表才能现在是一棵可以包含多个级别的树。你可能想把自己限制在你想在你的天赋的桌子上达到一定数量的水平,我想两级就足够了。这样,查询就更容易了。

还有什么我应该知道的吗?

当使用递归关系时..。外键应该分配无效,因为顶级天赋不会有parent_id.

祝你好运!)

编辑:ok。我创造了模型..。更好地解释它

编辑第二模型(以圣诞树的形状表示)--注意:模型与人才之间的关系是1x1关系,有不同的方法(评论上的相同链接)。

找出用户是否有天赋。加入查询=上的三个表),希望这有帮助

票数 3
EN

Stack Overflow用户

发布于 2010-12-01 14:30:03

您应该有一个包含有关用户的所有信息的表(姓名、道布、任何有关用户的其他信息)。您应该有一个包含所有有关人才的表(id,talentName,TopLevelTalentID (存储“子”人才,引用“父”人才))。对于用户和人才之间的多到多关系,您应该有第三个表: UserTalents,它存储UserID和TalentID。

这里有一篇文章解释了如何获得第三个NF:

http://www.deeptraining.com/litwin/dbdesign/FundamentalsOfRelationalDatabaseDesign.aspx

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4325161

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档