我正在为一个基于“人才”的网站启动一个新项目--例如:
我建议这样做的方法是,每个人才都有自己的表,并包含一个user_id字段来将记录映射到特定的用户。
任何在网站上注册的用户都可以为这些天赋中的一个或多个创建一个配置文件。一个天才可以有次天赋,例如,一个演员可以是一个电视演员,一个戏剧演员或一个配音演员。
例如,我有用户A-他是一个模特(T型台模型)和一个演员(电视演员,戏剧演员,配音演员)。
我的问题是:
发布于 2010-12-10 10:11:27
好吧,对不起,答案不对..这是另一种方法。
在我看来,用户可以有多种职业(演员、模特、音乐家等)。通常,我所做的是先在对象中思考,然后将其转换为表。在P.O.O.中,您将有一个类用户和Actor、Model等子类,其中每个子类都可以有诸如TvActor、VoiceOverActor等子类。在DB中,每个人才和子天赋都有一个表,它们都共享相同的主键(用户的id ),因此如果用户4是和Actor和一个模型,则在Actor的表上有一个注册表,在Model上有另一个注册表,这两个注册表都带有id=4
如你所见,储存是很容易的。复杂的部分是检索信息。这是因为数据库没有继承的概念(我认为mysql有,但我还没有尝试)。因此,如果您现在想使用用户4的子类,我会看到三个选项:
这三种选择各有优缺点。也许还有一个=)
祝好运
PS:啊,我找到了另一个选项,这里,或者可能是第二个改进的选项
发布于 2010-12-01 14:46:19
在回答你的问题之前..。我认为user_id不应该在人才榜上.这里的主要想法是:“对于一个天赋,你有许多用户,对于一个用户,您有多个天赋”。所以关系应该是NxN,您需要一个中间表
请参阅:多对多
现在
是否需要创建独立的表来存储此用户的子人才?
如果您想做一些动态的事情(添加或删除子人才),您可以使用递归关系。这是一个与其本身相关的表。
TABLE TALENT
-------------
id PK
label
parent_id PK FK (a foreign key to table Talent)
请参阅:递归关联
我应该如何为这个用户执行顶级人才的查找?也就是说,在user表中,是否应该有每个人才ID的字段?还是应该在每个顶级人才表中执行查找,以查看是否存在该user_id?
如果您以前使用过该模型,那么进行查询可能是一场噩梦,因为您的表才能现在是一棵可以包含多个级别的树。你可能想把自己限制在你想在你的天赋的桌子上达到一定数量的水平,我想两级就足够了。这样,查询就更容易了。
还有什么我应该知道的吗?
当使用递归关系时..。外键应该分配无效,因为顶级天赋不会有parent_id.
祝你好运!)
编辑:ok。我创造了模型..。更好地解释它
编辑第二模型(以圣诞树的形状表示)--注意:模型与人才之间的关系是1x1关系,有不同的方法(评论上的相同链接)。
找出用户是否有天赋。加入查询=上的三个表),希望这有帮助
发布于 2010-12-01 14:30:03
您应该有一个包含有关用户的所有信息的表(姓名、道布、任何有关用户的其他信息)。您应该有一个包含所有有关人才的表(id,talentName,TopLevelTalentID (存储“子”人才,引用“父”人才))。对于用户和人才之间的多到多关系,您应该有第三个表: UserTalents,它存储UserID和TalentID。
这里有一篇文章解释了如何获得第三个NF:
http://www.deeptraining.com/litwin/dbdesign/FundamentalsOfRelationalDatabaseDesign.aspx
https://stackoverflow.com/questions/4325161
复制相似问题