Mysql 如何使单个列引用多个表
我这里有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_目录: 第二幕 音乐节目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、歌曲名称、发行年份 我还预测了未来的变化,例如,如果一个乐队的团队成员想改变他的姓氏,这将影响“乐队”和“独立艺术家”表 直觉上我认为我的解决方案
不需要单独的独立艺术家表。把他们当作只有一个成员的乐队。而且您应该始终使用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,如果我想选择,我需要做一些吗?不,您可以只使用一个查询来选择您需要的关于表演者的所有信息。请看我的最新答案。谢谢您的详细解释!我希望我能投两次票