Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 为各种内容制作自己的类似系统_Asp.net_Sql Server_Database - Fatal编程技术网

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的查找表将完成设计。