我在SQLite数据库中有3个表:
歌曲:
_id | name | length | artist_id | album_id
艺术家:
_id | name
相册:
_id | name
我需要artist_id
表中的Songs
才能拥有多个值。实现这一目标的最佳方法是什么?
1-将其设为字符串字段,其值类似于:1, 2, 5
,其中每个数字代表Artists
表中的id。
2-为Songs
表中的每条记录创建一个表,其中每个表都有多个值(看起来非常糟糕?)。
3-创建一个包含以下字段的表:
_id | artist_id
其中_id
代表_id
表中的Songs
,并且它不是主键。虽然artist_id
是艺术家的身份。
问题的第二部分:
如果我正确创建3个表,如何编写查询以获得下表:
_id | name | length | artist1_id | artist1_name | artist2_id | artist2_name | ...
我把一首歌的所有艺术家都放在一张桌子里(虽然大多数歌曲中只有一位艺术家而有些没有)。
答案 0 :(得分:2)
案例是你有一个一个 艺术家可以写多个歌曲和一个 歌曲可由许多艺术家撰写。
结论many-to-many的结论。通常,这种类型的关系由附加表表示,该表存储您案例中的关系
<强> Artist_Song:强>
artist_id | song_id
然后您应该从艺术家表中删除该列。然后,normalized中的数据库为3NF。
这种方法不是经验法则,有时会因数据库解析数据所需的额外工作量而改变。
到目前为止,第二个问题依赖于DB模式。如果您使用上述结构,那么您将必须连接表以获取所有必需的信息,但这些信息将以行的形式显示,然后您应该转而在列中表示艺术家。
顺便说一句。请不要忘记,一首歌可以出现在不同的专辑中。
答案 1 :(得分:0)
1个问题:歌曲中的artist_id。典型的主 - 细节表
2个问题:我想最简单的方法是返回一个类似于下面的数据集,更容易解析并且更容易,但是动态创建列很困难,并且sqlite在执行此类操作时并不合作:
song_id | artist_id
上述数据集应该有重复的条目,因为艺术家有多首歌曲,并且通过artist_name的简单顺序,您可以非常整齐地订购它们。 然后对于所有必要的歌曲,只需进行第二次选择
从(1,2,3,4,...);
中的song_id歌曲中选择[fields]这将返回一个新数据集,其中包含该歌曲的所有必要信息。
答案 2 :(得分:0)
为什么艺术家,专辑和歌曲的ID都相同?
如果你制作artist_id和album_id外键,你就会有一个解决方案。
答案 3 :(得分:0)
对于你问题的第一部分,我建议你提出第三个提案。您只需通过执行此查询来获取歌曲,就可以跳过创建表格(如果需要):
select Songs.*
from Songs, Artists
where Songs.id = Artists.id and Artists.id = $the_id_of_the_artist_whose_songs_you_want_to_get$
对于你问题的第二部分,我不知道你是否可以做你的建议,但这是一个类似但不完全的解决方案。您可以使用此查询创建视图:
create view your_view as
select songs.id, songs.name, songs.length, artists.id, artists.name
from songs
left outer join artists
on songs.id = artists.id
where songs.id = &the_id_of_the_song_you_want&
但是,在我看来,您可以使用查询来获得您想要的结果:
select songs.id, songs.name, songs.length, artists.id, artists.name
from songs
left outer join artists
on songs.id = artists.id
where songs.id = &the_id_of_the_song_you_want&
以上内容将为歌曲中的每位艺术家返回多行,但不会为多列返回。