2010-12-01 129 views
2

我开始了基于 “人才” 网站一个新的项目 - 例如:关系数据库设计(MySQL的)

  • 模型
  • 演员
  • 歌手
  • 舞者
  • 音乐家

我建议这样做的方式是每个这些人才将h自己的表,并包括一个user_id字段将记录映射到特定的用户。

任何在网站上注册的用户都可以创建一个或多个这些人才的档案。例如,演员可以是电视演员,戏剧演员或配音演员。因此,例如我有用户A--他是一个模特(时装表演模特)和一个演员(电视演员,剧场演员,配音演员)。

我的问题是:

  1. 我需要创建单独的表来存储该用户的分型人才?

  2. 我该如何为这个用户执行顶级人才的查找?即在用户表中是否应该有每个人才ID的字段?或者我应该在每个顶级天赋表中执行查找以查看该user_id是否存在于那里?

  3. 还有什么我应该知道的?

回答

1

好的抱歉,不正确的答案..这是一种不同的方法。

我看到它的方式,一个用户可以有多个职业(演员,模特,音乐家等)。通常我所做的事情是首先在对象中思考,然后将其转化为表格。在P.O.O.你有一个类User和子类Actor,Model等等,它们中的每一个也可以有像TvActor,VoiceOverActor等子类,在每个人才和子类中都有一张表,所有人都分享相同的主键(用户的ID),所以如果用户4是和Actor和一个模型,你将有一个注册表在演员的表和模型表上的另一个,两个id = 4

正如你可以看,存储很容易..复杂的部分是检索信息。这是因为数据库不具有继承(我认为MySQL有,但我还没有尝试过)的概念..所以,如果你想现在用户4的subclases,我看到三个选项:

  • 多选择您拥有的每个人才和子表,并询问他们的ID是否为4.

    SELECT * FROM Actor WHERE id = 4; SELECT * FROM TvActor WHERE id = 4;

  • 做大查询在左侧的接合部的天赋和subtalent表从用户LEFT JOIN

    SELECT * JOIN演员ON User.id = Actor.id LEFT JOIN TvActor ON User.id = LEFT TvActor.id JOIN ... WHERE User.id = 4;

  • 与用户NxN的关系,建立一个人才表来存储的每一个人才和subtalents该用户具有参考,所以你不会要问所有的表。您必须对Talents表进行查询以找出需要查询的第二个查询表。

alt text

的这三个选项中的每一个都有各自的优点和缺点..也许还有另外一个=)

好运

PS:啊,我发现另一种选择here或也许这只是第二个选项的改进

2

您应该有一张表,其中包含关于用户(名称,dob,关于用户的任何其他信息)的所有信息。你应该拥有一张拥有关于天赋(id,talentName,TopLevelTalentID(将“sub”天赋放入“Parent”天赋的参考)的所有内容)的表格。你应该有第三个表格来表达用户和天分之间的多对多关系:UserTalents存储UserID和TalentID。

下面是说明如何获得第3 NF的文章:

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

2

这是一个很好的问题表现出一定的面向对象的思想和关系模型之间的异同。

首先,没有关于创建表格的严格规则,它取决于您尝试建模的问题空间(然而,每个表格的字段根本没有必要,并构成设计缺陷 - 主要是因为它不灵活且难以查询)。 对于在这种情况下,例如完全可以接受的设计是具有表

Names (Name, Email, Bio) 

Talents (TalentType references TalentTypes, Email references Names) 

TalentTypes (TalentType, Description, Parent references TalentTypes) 

上述设计将让你有层次TalentTypes并跟踪其名具有天赋,你将有一个单一的表,从中可以得到所有的名字(为了避免注册重复),你有一张表,从中你可以得到一个人才名单,你可以很容易地添加新的人才类型和/或亚型。

如果您确实需要在每种天赋类型中存储一些特殊文件,您仍然可以将这些文件添加为引用普通天赋表的表格。 作为一个例证

Models (Email references Talents, ModelingSalary) -- with a check constraint that talents contain a record with modelling talent type 

请注意,这只是一个例子,它可能是明智的有薪酬在人才表,而不是对特定人才的表。

如果你与在某种意义上,你可以看看表人才作为排序从一个特定的天赋或子继承的天赋属性的类的特定人才的表结束。回答你的问题之前

3

...我认为,USER_ID不应该在人才表......这里的主要思想是“1个人才你有很多用户,一个用户有多个人才”。 。这样的关系应该是N×N的,你需要一个中间表

见:many to many

现在

我需要创建单独的表来存储这个 用户的分型人才?

如果你想做一些动态的事情(添加或删除子节点),你可以使用递归关系。这是关系到自身的表

TABLE TALENT 
------------- 
id PK 
label 
parent_id PK FK (a foreign key to table Talent) 

见:recursive associations

我应该如何执行的顶级人才查找此 用户?即在用户表中应该有 有字段为每个人的ID为 ?或者我应该在每个顶级天赋表中执行查询 以查看 ,如果那个user_id存在那里的话?

如果你之前使用的型号,它可能是一个噩梦进行查询,因为你的表人才,现在是可以包含多个层次..你可能要自己限制在一定数量的树你想在你的天赋桌上的水平,我想两个就足够了......这样你的查询会更容易

还有什么我应该知道的?

用递归关系...外键应有alow空,因为高层人才不会有PARENT_ID时

...

祝你好运! :)

编辑:确定..我创建了模型..解释它更好

model

编辑第二种模式(在圣诞树的形状= d)注意型号&人才和演员之间的关系&人才是一个1x1的关系,也有不同的方法要做到这一点(the same link on the comments

alt text

找到,如果用户有才华..加入三个表的查询=) 希望这有助于

+0

嗨,我想这可能已被误解,但基本上我想说的是会有b e分开的人才表,其中我为每个拥有该人才的用户创建条目。每个天赋表中的字段都与该特定人才相关。 – GSTAR 2010-12-01 15:15:00

+0

@pleasedontbelog +1 @GSTAR,其实我不认为它被误解了。我怀疑你不知道如何从上述设计中获得用户的所有才能?如果是这样,让我们​​知道,我们可以演示如何获得用户拥有的所有人才,或拥有人才的所有用户,等等...... – Unreason 2010-12-01 16:47:13