具有多个值的SQLite列

时间:2012-07-05 10:47:47

标签: android sql database sqlite

我在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 | ...

我把一首歌的所有艺术家都放在一张桌子里(虽然大多数歌曲中只有一位艺术家而有些没有)。

4 个答案:

答案 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&

以上内容将为歌曲中的每位艺术家返回多行,但不会为多列返回。