关系数据库设计(MySQL)

关系数据库设计(MySQL),sql,mysql,database,database-design,Sql,Mysql,Database,Database Design,我正在为一个基于“人才”的网站启动一个新项目,例如: 模型 演员 歌手 舞者 音乐家 我建议这样做的方式是,这些人才中的每一位都有自己的表,并包括一个user_id字段,用于将记录映射到特定的用户 任何在网站上注册的用户都可以为其中一个或多个人才创建个人资料。天赋可以有子天赋,例如,演员可以是电视演员、戏剧演员或配音演员 例如,我有一个用户A——他是模特(T台模特)和演员(电视演员、戏剧演员、配音演员) 我的问题是: 我是否需要创建单独的表来存储此用户的子天赋 我应该如何为该用户查找顶级人才

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

  • 模型
  • 演员
  • 歌手
  • 舞者
  • 音乐家
我建议这样做的方式是,这些人才中的每一位都有自己的表,并包括一个user_id字段,用于将记录映射到特定的用户

任何在网站上注册的用户都可以为其中一个或多个人才创建个人资料。天赋可以有子天赋,例如,演员可以是电视演员、戏剧演员或配音演员

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

我的问题是:

  • 我是否需要创建单独的表来存储此用户的子天赋

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

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


  • 您应该有一个表,其中包含关于用户的所有信息(名称、dob、关于用户的任何其他信息)。您应该有一个表,其中包含有关人才的所有信息(id、talentName、TopLevelTalentID(要存储“子”人才,请将引用放在“父”人才上))。对于用户和人才之间的多对多关系,您应该有第三个表:usertaliants,它存储UserID和TalentID

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


    这是一个很好的问题,可以展示面向对象思维和关系建模之间的一些差异和相似之处

    首先,关于创建表没有严格的规则,这取决于您试图建模的问题空间(但是,为每个表都设置一个字段根本不是必需的,这构成了一个设计错误-主要是因为它不灵活且难以查询)。 例如,在这种情况下,完全可以接受的设计是有表格

    Names (Name, Email, Bio)
    
    Talents (TalentType references TalentTypes, Email references Names)
    
    TalentTypes (TalentType, Description, Parent references TalentTypes)
    
    上述设计将允许您拥有层次化的人才类型,并跟踪哪些姓名拥有哪些人才,您将拥有一个表,从中可以获得所有姓名(以避免注册重复的姓名),您可以从一个表中获得人才列表,并可以轻松添加新的人才类型和/或子类型

    如果您确实需要在每种人才类型上存储一些特殊文件,您仍然可以将这些文件添加为参考常规人才表的表。 举例说明

    Models (Email references Talents, ModelingSalary) -- with a check constraint that talents contain a record with modelling talent type
    
    请注意,这只是一个示例,在人才表中包含薪水可能是明智的,而不包含特定人才的表格


    从某种意义上说,如果您最终得到了特定人才的表格,您可以将人才表格视为特定人才或子人才继承属性的类

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

    见:

    现在

    我是否需要创建单独的表来存储此天赋的子天赋 用户

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

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

    我应该如何为这个项目查找顶级人才 用户?即,在用户表中 每个字段的ID都有字段 才能或者我应该执行查找吗 在每个顶级人才表中查看 如果该用户id存在于其中

    如果您以前使用过该模型,那么进行查询可能是一场噩梦,因为您的表现在是一个可以包含多个级别的树。。你可能想把自己限制在某个特定的级别,我想两个级别就足够了。。这样,您的查询将更容易

    还有什么我应该知道的吗

    使用递归关系时。。。外键应该为空,因为顶级人才没有父id

    祝你好运!:)

    编辑:确定。。我已经创建了模型。。为了更好地解释它

    编辑第二个模型(圣诞树形状=D)请注意,模型与人才以及演员与人才之间的关系是1x1关系,有不同的方法()

    查找用户是否有天赋。。将查询中的三个表联接起来=)
    希望这有帮助

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

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

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

    • 对您拥有的每个天赋和副天赋表进行多次选择,询问其id是否为4

      从参与者中选择*,其中id=4;从TvActor中选择*,其中id=4

    • 在左侧联接上联接所有人才和子人才表时进行大查询

      从用户上的用户左JOIN Actor中选择*id=Actor.id左JOIN TvActor ON User.id=TvActor.id左JOI