0

您好我一直面临一个小问题,如何为这种情况有效地创建数据库:

一、数据库方案。

CREATE TABLE IF NOT EXISTS `songs` (
`url` varchar(12) NOT NULL,
`author` varchar(250) NOT NULL,
`name` varchar(255) NOT NULL,
`id` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=293 ;


CREATE TABLE IF NOT EXISTS `account` (
`id` int(11) NOT NULL,
`login` varchar(15) NOT NULL,
`password` varchar(20) NOT NULL,
`social_fb` varchar(20) NOT NULL,
`social_yt` varchar(20) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE IF NOT EXISTS `playlists` (
`id` int(11) NOT NULL,
`accountid` int(11) NOT NULL,
`songs` varchar(10000) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

二、思想。

每个用户(帐户)可以有多个播放列表。播放列表将包含以 id 存储在“歌曲”中的歌曲。

三、结论

1)我非常确定这个数据库方案不是针对这类问题修复的。我不知道它如何将songs.id 放入播放列表表并将其分配给用户。你能帮我解释一下它应该是什么样子吗?

2) 从用户中检索单个播放列表的可能查询 a) 获取分配给用户帐户的播放列表的 ID。

谢谢你的时间。

4

2 回答 2

2

您必须创建一个名为 playlist_has_song 的第四个表或类似的东西,您可以在其中映射哪些歌曲在哪个播放列表中。然后您可以删除播放列表表中的歌曲列。

所以你有了:

table: song
-----------
id (PK)
url
author
name

table: account
--------------
id (PK)
login
password
social_fb
social_yt

table: playlist
---------------
id (PK)
accountid (FK to account.id)

table: playlist_has_song
------------------------
playlistid (FK to playlist.id)
songid (FK to song.id)

请注意,表的名称始终是单数而不是复数。

查询

获取分配给用户帐户的播放列表的 ID:

SELECT id FROM playlist WHERE userid = ?
于 2013-10-29T13:36:38.953 回答
0

您的播放列表表不应该有一个列,其中包含您尝试过的播放列表中的所有歌曲。相反,创建一个像 playlist_song 这样的子表,每个播放列表每首歌曲都有一行。这将成为歌曲列表。就像是:

playlist_song (
  playlist_id int,
  song_id int
)
于 2013-10-29T13:37:54.923 回答