Asp.net 为各种内容制作自己的类似系统
我的数据库中有三种类型的内容。它们是歌曲、专辑和播放列表。专辑和播放列表只是歌曲的集合。我想让用户为它们中的每一个都添加类似的内容。我用柱子做了一张桌子Asp.net 为各种内容制作自己的类似系统,asp.net,sql-server,database,Asp.net,Sql Server,Database,我的数据库中有三种类型的内容。它们是歌曲、专辑和播放列表。专辑和播放列表只是歌曲的集合。我想让用户为它们中的每一个都添加类似的内容。我用柱子做了一张桌子 LikeId UserId SongId PlaylistId AlbumId 储存喜欢的东西。例如,若用户喜欢歌曲,我将歌曲的id放入SongId列,将用户id放入UserId列。其他列将为空。它工作得很好,但我不喜欢这个解决方案,因为它没有标准化。 所以我想问一下,是否有更好的解决方案。怎么样 LikeId UserId LikeTyp
LikeId UserId SongId PlaylistId AlbumId
储存喜欢的东西。例如,若用户喜欢歌曲,我将歌曲的id放入SongId列,将用户id放入UserId列。其他列将为空。它工作得很好,但我不喜欢这个解决方案,因为它没有标准化。
所以我想问一下,是否有更好的解决方案。怎么样
LikeId UserId LikeType TargetId
LikeType可以是歌曲、播放列表或专辑吗?您的解决方案很好。它有一个很好的特性,您可以设置与其他表的显式外键关系。此外,可以通过添加检查约束来验证是否设置了其中一个值:
check ((case when SongId is null then 0 else 1 end) +
(case when AlbumId is null then 0 else 1 end) +
(case when PlayListId is null then 0 else 1 end)
) = 1
为所有三个存储空值会产生开销。这对于三个值来说是相当小的
您甚至可以添加计算列以获取存储的值:
WhichId = (case when SongId is not null then 'Song'
when AlbumId is not null then 'Album'
when PlayListId is not null then 'PlayList
end);
作为惩罚的贪吃者,我会使用三个表格:UserLikesSong、UserLikesPlaylists和UserLikesAlbums。每个表都包含一个用户标识和对其他表之一的适当引用:歌曲、唱片集或播放列表 这还允许添加其他特定于类型的信息。也许专辑将来会支持一首喜爱的歌曲
您可以始终使用UNION来组合来自各种实体类型的数据。您只需创建3个表-一个用于与播放列表、歌曲和唱片集中的每一个配对的用户。它们看起来像:
CREATE TABLE PlaylistLikes
(
UserID INT NOT NULL,
PlaylistID INT NOT NULL,
PRIMARY KEY (UserID, PlaylistID),
FOREIGN KEY (UserID) REFERENCES Users (UserID),
FOREIGN KEY (PlaylistID) REFERENCES Playlists (PlaylistID)
);
CREATE TABLE SongLikes
(
UserID INT NOT NULL,
SongID INT NOT NULL,
PRIMARY KEY (UserID, SongID),
FOREIGN KEY (UserID) REFERENCES Users (UserID),
FOREIGN KEY (SongID) REFERENCES Songs (SongID)
);
CREATE TABLE AlbumLikes
(
UserID INT NOT NULL,
AlbumID INT NOT NULL,
PRIMARY KEY (UserID, AlbumID),
FOREIGN KEY (UserID) REFERENCES Users (UserID),
FOREIGN KEY (AlbumID) REFERENCES Albums (AlbumID)
);
在这里,主键中有两列可以防止用户多次喜欢歌曲/播放列表/专辑,除非您希望它可用-然后删除它,或者在“喜欢的数量”列中跟踪它
你应该避免把所有3种不同类型的喜欢放在同一个表中——不同的表应该用来表示不同的东西。您希望避免使用一个真正的查找表-以下是一个详细说明原因的答案:
如果要查询所有3个表,可以创建一个视图,该视图是3个表之间联合的结果 谢谢你的回答。它比我的解决方案有趣而且紧凑。如果我找不到更好的,也许我会用它。但我将搜索更规范化的解决方案。此解决方案将允许您添加新的类似类型,例如艺术家,而无需进一步更改数据库。LikeType的查找表将完成设计。