Sql 模特音乐艺术家/团体

Sql 模特音乐艺术家/团体,sql,database-design,Sql,Database Design,我正在构建一个web应用程序,显示50年代和60年代的图表记录/相册 目前我有类似的东西(很多不相关的东西被移除): 名为“group”的表曾经被建模为“person”表、“person\u group”连接表和“group”表。问题是外键“group\u performance\u role.group\u id”不能同时引用“person”和“group”表 我决定保持这种结构,但要求每个“人”自动成为一个由1人组成的“组”;然而,这造成了命名的模糊性,意味着表格中包含不止一个东西——有时

我正在构建一个web应用程序,显示50年代和60年代的图表记录/相册

目前我有类似的东西(很多不相关的东西被移除):

名为“group”的表曾经被建模为“person”表、“person\u group”连接表和“group”表。问题是外键“group\u performance\u role.group\u id”不能同时引用“person”和“group”表

我决定保持这种结构,但要求每个“人”自动成为一个由1人组成的“组”;然而,这造成了命名的模糊性,意味着表格中包含不止一个东西——有时是一个艺术家(“约翰·列侬”),有时是一个团体(“披头士”)

我需要找到一种方法将艺术家(可能是一个人或一群人)与表演联系起来,同时避免像桌子上放着不止一种“类型”的东西这样的不良做法

我在网上搜索过,但没有找到相关的答案。非常感谢任何帮助/建议/建议


编辑:角色表是一个查找表,用于查找个人/团体可以在演出中扮演的角色。例如:“艺术家”、“作曲家”、“管弦乐队指挥”等,我认为你的方式可能有道理。我假设您分别对组和组成员/人员进行建模,因为您希望对组和组成员执行不同的操作/操作(如果没有,为什么还要对组成员进行建模)

如果是这样,那么我假设在John Lennon的案例中,您希望能够对他执行个人操作和组操作,因此让他作为组和组成员在DB中出现两次是有意义的,因为这两个实体代表John Lennon在您的域中扮演的不同角色。

  • 一张唱片有许多歌曲
  • 每首歌都有一位艺术家,他有一个名字
  • 艺术家有一个或多个版本
  • 艺人版本有一个或多个演员成员
乙二醇


您的最终目标是存储性能数据库,对吗

因此,一场演出是由某一类别的表演者表演,由某一类别的作曲家安排,由某一类别的制作人制作,等等。我认为你需要一个抽象的实体来代表所有这些可能性。我现在能说的最好的名词是信用,因为你会“为你的名字扩展信用。”()

因此,按照我的想象,你会有几类信用,在第一级,我想象这些是个人集团,这是一组个人组织,类似于“Parlephone”或“Island Records”等

根据您希望存储的态度,这些信用类别可能有子类别。但是,我认为每个性能都有许多性能编辑关系,每个性能编辑关系都有一个外键指向性能编辑类型


所有这些都忽略了与歌曲的任何关系,我认为这在逻辑上与表演是分开的,歌曲会有自己的歌曲信用关系,歌曲信用类型“作者”是显而易见的。每首歌曲都与许多演出相关

这一切都很好地扩展到了录制(DVD、78、LP、MP3等),这将是性能的集合,但可以而且确实有自己的信用


我认为这是有道理的,因为我假设你会从信用卡中得到这些信息

我想你需要这样的灵活性。考虑一下,如果我想报告所有的事情,他的直接信用,无论是独奏还是成组,作为一个作家,作曲家,音乐家和制作人是巨大的。然后考虑他所创作的歌曲,由其他MusiaCias等人< /P> < P> >考虑使用各种类型或艺术家的模型:

(顺便说一句,您的
Group\u成员
表允许分组。我猜这不是您想要的。)

但是,这会忽略角色可能因艺术家类型而异的任何差异。例如,让整个团队成为“指挥者”是没有意义的。如果强制执行这些类型的约束很重要,您可以采取“暴力”方法,简单地将特定于个人的角色与特定于组的角色分开:

(顺便说一句,如果您想防止组特定角色和个人特定角色的名称重叠,您必须将这两个角色表放在继承层次结构中。此处未显示。)

当然,这仍然不尊重某些角色的重要性。例如,只有一个人(每次演出)可以担任“指挥”。要解决这个问题,您必须进一步扩展模型:

可能也需要为这些团体做类似的事情

要通过这三种角色中的任何一种让参与给定性能(例如
27
)的所有人员参与,您需要类似于以下内容的查询:

SELECT *
FROM Person
WHERE person_id IN (

    SELECT person_id
    FROM Group_Person JOIN Group_Performance_Role
        ON Group_Person.group_id = Group_Performance_Role.group_id
    WHERE performance_id = 27

    UNION

    SELECT person_id
    FROM Person_Performance_MultiRole
    WHERE performance_id = 27

    UNION

    SELECT person_id
    FROM Person_Performance_SingleRole
    WHERE performance_id = 27

)
请注意,此列表最多列出一次人员,即使他们在多个角色中参与演出(例如,同一个人可以是“指挥”和在同一演出中扮演角色的团队成员)

要获取他们的角色名称,您可以:

SELECT Person.*, group_role_name
FROM Person
    JOIN Group_Person
        ON Person.person_id = Group_Person.person_id
    JOIN Group_Performance_Role
        ON Group_Person.group_id = Group_Performance_Role.group_id
WHERE performance_id = 27

UNION ALL

SELECT Person.*, person_multirole_name
FROM Person
    JOIN Person_Performance_MultiRole
        ON Person.person_id = Person_Performance_MultiRole.person_id
WHERE performance_id = 27

UNION ALL

SELECT Person.*, person_singlerole_name
FROM Person
    JOIN Person_Performance_SingleRole
        ON Person.person_id = Person_Performance_SingleRole.person_id
WHERE performance_id = 27

如你所见,我们不断地使模型越来越精确,但也越来越复杂。我们甚至还没有进入歌曲和专辑,以及不断发展的团队成员(等等…)。我想你有责任决定“精确性”和简单性之间的平衡点

SELECT Person.*, group_role_name
FROM Person
    JOIN Group_Person
        ON Person.person_id = Group_Person.person_id
    JOIN Group_Performance_Role
        ON Group_Person.group_id = Group_Performance_Role.group_id
WHERE performance_id = 27

UNION ALL

SELECT Person.*, person_multirole_name
FROM Person
    JOIN Person_Performance_MultiRole
        ON Person.person_id = Person_Performance_MultiRole.person_id
WHERE performance_id = 27

UNION ALL

SELECT Person.*, person_singlerole_name
FROM Person
    JOIN Person_Performance_SingleRole
        ON Person.person_id = Person_Performance_SingleRole.person_id
WHERE performance_id = 27