Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何使单个列引用多个表_Mysql_Sql_Database Design - Fatal编程技术网

Mysql 如何使单个列引用多个表

Mysql 如何使单个列引用多个表,mysql,sql,database-design,Mysql,Sql,Database Design,我这里有4个表,它们的关系如下: 对于“band”表,我有4列:id、band\u name、first\u name、last\u name。名字和姓氏指的是“独立艺术家”表中的列 对于“独立艺术家”,我有3列:id、名字、姓氏 对于“表演”表,我有3列:id、表演者、音乐。这里的香水,我想指的是乐队和独立艺术家表 对于“音乐”表,我有3列:id、歌曲名称、发行年份 我还预测了未来的变化,例如,如果一个乐队的团队成员想改变他的姓氏,这将影响“乐队”和“独立艺术家”表 直觉上我认为我的解决方案

我这里有4个表,它们的关系如下:

对于“band”表,我有4列:id、band\u name、first\u name、last\u name。名字和姓氏指的是“独立艺术家”表中的列

对于“独立艺术家”,我有3列:id、名字、姓氏

对于“表演”表,我有3列:id、表演者、音乐。这里的香水,我想指的是乐队和独立艺术家表

对于“音乐”表,我有3列:id、歌曲名称、发行年份

我还预测了未来的变化,例如,如果一个乐队的团队成员想改变他的姓氏,这将影响“乐队”和“独立艺术家”表

直觉上我认为我的解决方案不好,有谁能为表格提供更好的设计吗?谢谢。

以下是我的建议:

波段表:

波段id PK 乐队名称 艺术家表:

艺术家身份证 名字 姓 乐队成员表:

波段id FK 艺术家 Acts表格:

动作识别PK 波段id FK 音乐桌:

音乐识别码PK 宋姓 发布年份 Act_目录:

第二幕 音乐节目 不需要单独的独立艺术家表。把他们当作只有一个成员的乐队。而且您应该始终使用ID作为外键,这样您就不必担心在属性更改时更新引用;您只需在一个地方更改它,引用就不会受到影响。

以下是我的建议:

波段表:

波段id PK 乐队名称 艺术家表:

艺术家身份证 名字 姓 乐队成员表:

波段id FK 艺术家 Acts表格:

动作识别PK 波段id FK 音乐桌:

音乐识别码PK 宋姓 发布年份 Act_目录:

第二幕 音乐节目
不需要单独的独立艺术家表。把他们当作只有一个成员的乐队。而且您应该始终使用ID作为外键,这样您就不必担心在属性更改时更新引用;您只需在一个位置更改它,引用不会受到影响。

您可能希望乐队和艺术家之间存在一对多关系,其中乐队可以通过id或艺术家引用一个或多个艺术家。这样,名字和姓氏将保留在艺术家表中,而不会在乐队表中重复

至于您遇到的另一个问题,您不能在一个关系中引用多个外部表中的列。您必须通过在Act表中创建两列来建模,一列引用band,另一列引用Artister,并添加一个约束,即只有一列可以为非null,或者其他一些


也就是说,你可能想寻求灵感。我过去曾使用过该数据库,该项目是由许多聪明的人开发的,他们在该模型上工作了一段时间。

你可能希望乐队和艺术家之间有一对多的关系,乐队可以根据id或艺术家引用一个或多个艺术家。这样,名字和姓氏将保留在艺术家表中,而不会在乐队表中重复

至于您遇到的另一个问题,您不能在一个关系中引用多个外部表中的列。您必须通过在Act表中创建两列来建模,一列引用band,另一列引用Artister,并添加一个约束,即只有一列可以为非null,或者其他一些


也就是说,你可能想寻求灵感。我过去曾使用过该数据库,该项目是由许多聪明的人开发的,他们在该模型上工作了一段时间。

我同意Barmar的回答,但我会为独立艺术家添加一个额外的专栏,该值将是“是”或“否”

艺术家表: *艺术家id *名字 *姓
*独立艺术家

我同意巴尔马的回答,但我会为独立艺术家添加一个额外的栏,该值将是“是”或“否”

艺术家表: *艺术家id *名字 *姓 *独立艺术家

你很伤心-你需要一个与表演相关的表演者,而不是乐队或艺术家。我的意思是你需要一个与act对象相关的对象的抽象。然后,表演者将首先链接到乐队对象,然后链接到艺术家。您需要根据当前指向两个对象之一的链接,从语法上确定表演者是乐队还是独立艺术家。 当然,你们需要乐队和艺术家之间的多对多关系。 大概是这样的:

band(id PK, name)
artist(id PK, first_name, last_name)
band_artists(band_id, artist_id)
performer(id PK, band_id, artist_id)
act(id PK, performer_id, music_id)
music(id, song_name, release_year)
我不建议你只为乐队和艺术家使用一件物品,因为他们有不同的意义和自己的生活。在未来,你可能会想给艺术家添加一些身体特征,例如,与坏音乐无关等等

很容易知道表演者是乐队还是艺术家。在第一种情况下,band_id字段将具有非NULL值。在第二种情况下,您将得到一个空值 在band_id中,艺术家id字段中的非空值

例如,如果需要检索与歌曲相关的表演者信息,可以通过以下方式执行:

SELECT 
    music.song_name, 
    performer.id as performer_id, 
    group.name as group_name,
    artist.first_name,
    artist.second_name
FROM music 
    LEFT JOIN act on music.id = act.music_id
    LEFT JOIN performer on act.performer_id = performer.id
    LEFT JOIN band on performer.band_id = band.id
    LEFT JOIN artist on performer.artist_id = artist.id
现在,如果您的程序逻辑需要计算执行者名称:

if performer.band_name is not None:
    performer.name = performer.band_name
else:
    performer.name = performer.first_name + ' ' + performer.last_name
我相信示例代码是不言自明的,即使它不是用您的编程语言编写的,并且对查询结果进行了一些预处理,以获得示例中使用的performer对象

你很伤心-你需要的是一个与表演相关的表演者,而不是乐队或艺术家。我的意思是你需要一个与act对象相关的对象的抽象。然后,表演者将首先链接到乐队对象,然后链接到艺术家。您需要根据当前指向两个对象之一的链接,从语法上确定表演者是乐队还是独立艺术家。 当然,你们需要乐队和艺术家之间的多对多关系。 大概是这样的:

band(id PK, name)
artist(id PK, first_name, last_name)
band_artists(band_id, artist_id)
performer(id PK, band_id, artist_id)
act(id PK, performer_id, music_id)
music(id, song_name, release_year)
我不建议你只为乐队和艺术家使用一件物品,因为他们有不同的意义和自己的生活。在未来,你可能会想给艺术家添加一些身体特征,例如,与坏音乐无关等等

很容易知道表演者是乐队还是艺术家。在第一种情况下,band_id字段将具有非NULL值。在第二个字段中,band_id中有一个空值,artist_id字段中有一个非空值

例如,如果需要检索与歌曲相关的表演者信息,可以通过以下方式执行:

SELECT 
    music.song_name, 
    performer.id as performer_id, 
    group.name as group_name,
    artist.first_name,
    artist.second_name
FROM music 
    LEFT JOIN act on music.id = act.music_id
    LEFT JOIN performer on act.performer_id = performer.id
    LEFT JOIN band on performer.band_id = band.id
    LEFT JOIN artist on performer.artist_id = artist.id
现在,如果您的程序逻辑需要计算执行者名称:

if performer.band_name is not None:
    performer.name = performer.band_name
else:
    performer.name = performer.first_name + ' ' + performer.last_name

我相信示例代码是不言自明的,即使它不是用您的编程语言编写的,并且对查询结果进行了一些预处理,以获得示例中使用的performer对象

我建议如下

存在一个act,该act是单个艺术家或乐队,如act_类型的艺术家id和乐队id所示,它们都是各自表的主键和act_id的外键。乐队是一个或多个单个艺术家的协作,也可以是多个乐队的协作,或者一个或多个乐队和一个或多个艺术家的合作

有一个录音是单曲或唱片集/EP,如录音类型所示。song_id和album_id都是主键或各自的表,是录音的外键。唱片集/EP由多首单曲组成

一首歌必须与一个动作相关联。但是,相册可能不会直接与某个动作关联,例如编译相册。可能有一些演员不自己发行唱片,而只是作为乐队的一部分发行。如果录音本身不可用,但仅作为相册的一部分,则录音可能有发布日期,也可能没有发布日期

+---------------------+     +----------+                 +----------------+     +---------------------------+
| ACT_RELATIONSHIPS   |     | ACTS     |                 | RECORDINGS     |     | RECORDING_RELATIONSHIPS   |
+---------------------+     +----------+                 +----------------+     +---------------------------+
| act_relationship_id |-----| act_id   |-----------------| recording_id   |-----| recording_relationship_id |
| parent_act_id       |-----| act_type |                 | recording_type |-----| parent_recording_id       |
| child_act_id        |     +----------+                 | act_id         |     | child_recording_id        |
| start_date          |      |        |                  | release_date   |     +---------------------------+
| end_date            |      |        |                  +----------------+
+---------------------+      |        |                       |      |
                             |        |                       |      |
                  +-------------+  +-----------+    +-----------+  +------------+
                  | ARTISTS     |  | BANDS     |    | SONGS     |  | ALBUMS     |
                  +-------------+  +-----------+    +-----------+  +------------+
                  | artist_id   |  | band_id   |    | song_id   |  | album_id   |
                  | family_name |  | band_name |    | song_name |  | album_name |
                  | given_name  |  +-----------+    +-----------+  +------------+
                  +-------------+

我建议如下

存在一个act,该act是单个艺术家或乐队,如act_类型的艺术家id和乐队id所示,它们都是各自表的主键和act_id的外键。乐队是一个或多个单个艺术家的协作,也可以是多个乐队的协作,或者一个或多个乐队和一个或多个艺术家的合作

有一个录音是单曲或唱片集/EP,如录音类型所示。song_id和album_id都是主键或各自的表,是录音的外键。唱片集/EP由多首单曲组成

一首歌必须与一个动作相关联。但是,相册可能不会直接与某个动作关联,例如编译相册。可能有一些演员不自己发行唱片,而只是作为乐队的一部分发行。如果录音本身不可用,但仅作为相册的一部分,则录音可能有发布日期,也可能没有发布日期

+---------------------+     +----------+                 +----------------+     +---------------------------+
| ACT_RELATIONSHIPS   |     | ACTS     |                 | RECORDINGS     |     | RECORDING_RELATIONSHIPS   |
+---------------------+     +----------+                 +----------------+     +---------------------------+
| act_relationship_id |-----| act_id   |-----------------| recording_id   |-----| recording_relationship_id |
| parent_act_id       |-----| act_type |                 | recording_type |-----| parent_recording_id       |
| child_act_id        |     +----------+                 | act_id         |     | child_recording_id        |
| start_date          |      |        |                  | release_date   |     +---------------------------+
| end_date            |      |        |                  +----------------+
+---------------------+      |        |                       |      |
                             |        |                       |      |
                  +-------------+  +-----------+    +-----------+  +------------+
                  | ARTISTS     |  | BANDS     |    | SONGS     |  | ALBUMS     |
                  +-------------+  +-----------+    +-----------+  +------------+
                  | artist_id   |  | band_id   |    | song_id   |  | album_id   |
                  | family_name |  | band_name |    | song_name |  | album_name |
                  | given_name  |  +-----------+    +-----------+  +------------+
                  +-------------+

让一个有名字的艺术家表和一个表明他们是否独立的标志怎么样?你是说我合并了“乐队”和“独立艺术家”表吗?如果是这样,那么如果艺术家是乐队,则first_name和last_name的值将为空,否则乐队的名称将为空。如果我误解了,请纠正我。谢谢。是的,我看不出有什么令人信服的理由让我们有两张单独的桌子。特别是当一个表演需要涉及乐队或艺术家时。让一个有名字的艺术家表和一个表明他们是否独立的标志如何。你的意思是我合并了“乐队”和“独立艺术家”表吗?如果是这样,那么如果艺术家是乐队,则first_name和last_name的值将为空,否则乐队的名称将为空。如果我误解了,请纠正我。谢谢。是的,我看不出有什么令人信服的理由让我们有两张单独的桌子。特别是如果一个表演需要涉及乐队或艺术家。谢谢你的建议,我想合并表演和表演

ents表格合并成一个表格,这样做会有任何缺点吗?它不是标准化的,因为你必须在每一行重复乐队id。嗨,Barmar,这是否意味着如果我想做一些选择,比如“选择艺术家的歌曲”,我必须做如下操作:“从音乐中选择歌曲名称,表演内容,表演,乐队,乐队成员,艺术家,其中music.music\u id=act\u contents.music\u id和。。而band_members.artist_id=artist.id'?是的。当您正确规范化数据时,通常需要连接许多表以获得问题的答案。如果您经常需要引用表的组合,请为它们创建视图。感谢您的建议,我想将Acts和Act_内容表合并为一个,这样做会有什么坏处吗?它不是标准化的,因为你必须在每一行重复乐队id。嗨,Barmar,这是否意味着如果我想做一些选择,比如“选择艺术家的歌曲”,我必须做如下操作:“从音乐中选择歌曲名称,表演内容,表演,乐队,乐队成员,艺术家,其中music.music\u id=act\u contents.music\u id和。。而band_members.artist_id=artist.id'?是的。当您正确规范化数据时,通常需要连接许多表以获得问题的答案。如果您经常需要引用表的组合,请为它们创建视图。我认为Barmar的意图是一列不可能引用多个列,因此,他建议将独立艺术家和乐队视为同一个“乐队”,但独立艺术家是一个只有一名成员的乐队。根据您的建议,如果将一个独立的艺术家列添加到艺术家表中,以便Acts表直接引用艺术家表,则会返回到原始问题:一个列不能同时引用多个表。如果我误解了,请纠正我,谢谢:D如果艺术家同时独立表演和作为乐队成员表演会怎么样?我认为Barmar的意图是一个专栏不可能引用超过1个专栏,因此他建议将独立艺术家和乐队视为同一个“乐队”,除了一个独立的艺术家是一个只有一个成员的乐队。根据您的建议,如果将一个独立的艺术家列添加到艺术家表中,以便Acts表直接引用艺术家表,则会返回到原始问题:一个列不能同时引用多个表。如果我误解了,请纠正我,谢谢:如果这位艺术家既独立表演又作为乐队成员表演,该怎么办?谢谢你的建议。我这里有一个问题,如果我想选择一首歌曲和它的表演者,我将如何使用SQL,如果我想选择,我需要做一些吗?不,您可以只使用一个查询来选择您需要的关于表演者的所有信息。请看我的最新答案。谢谢您的详细解释!我希望我能投两票谢谢你的建议。我这里有一个问题,如果我想选择一首歌曲和它的表演者,我将如何使用SQL,如果我想选择,我需要做一些吗?不,您可以只使用一个查询来选择您需要的关于表演者的所有信息。请看我的最新答案。谢谢您的详细解释!我希望我能投两次票