1

我在 SQLite 数据库中有 3 个表:

歌曲:

_id | name | length | artist_id | album_id

艺术家:

_id | name

专辑:

_id | name

我需要artist_idSongs表中才能拥有多个值。实现这一目标的最佳方法是什么?

1- 将其设为字符串字段,其值类似于:1, 2, 5,其中每个数字代表Artists表中的一个 id。

2-为表中的每条记录创建一个表Songs,其中每个表都有多个值(似乎非常糟糕的解决方案?!)。

3-创建一个包含以下字段的表:

_id | artist_id

where_id表示_idSongs表中,不是主键。Whileartist_id是艺术家的 id。


问题的第二部分:

如果我正确创建了 3 个表,我如何编写查询以获得下表:

_id | name | length | artist1_id | artist1_name | artist2_id | artist2_name | ...

我将一首歌的所有艺术家放在一张桌子上(尽管大多数歌曲只有一个艺术家,有些没有)。

4

4 回答 4

2

情况是你有一个 艺术家可以写很多首歌,而 首歌可以由很多艺术家写。

这结束了关联多对多。通常,这种类型的关系由存储关系的附加表表示,在您的情况下将是

艺术家_歌曲:

artist_id | song_id

然后,您应该从Artist表中删除该列。然后数据库将在3NF中标准化

这种方法不是经验法则,有时会因为数据库解析数据需要额外的工作量而改变。

就第二个问题而言,这取决于数据库模式。如果您使用上述结构,那么您将必须连接表格以获得所有必需的信息,但这些信息将按行显示,那么您应该旋转以在列中表示艺术家。

顺便提一句。请不要忘记一首歌可以出现在不同的专辑中。

于 2012-07-05T11:33:14.860 回答
0

1个问题:歌曲中的artist_id。典型的主从表

2问题:我想最简单的方法是返回一个如下所示的数据集,虽然动态创建列很困难,但解析起来更容易,而且sqlite在做这些事情时并不那么合作:

歌曲ID | 艺术家 ID

上面的数据集应该有重复的条目,因为一个艺术家有不止一首歌曲,这样通过艺术家姓名的简单排序,你可以非常整齐地排序。然后对于所有必要的歌曲,只需进行第二次选择

从 song_id 在 (1,2,3,4,...) 中的歌曲中选择 [字段];

这将返回一个包含歌曲所有必要信息的新数据集。

于 2012-07-05T11:00:30.420 回答
0

为什么艺术家、专辑和歌曲的 ID 相同?

如果您制作artist_id 和album_id 外键,您将有一个解决方案。

于 2012-07-05T11:07:36.967 回答
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&

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

于 2012-07-05T11:08:01.290 回答