c# - 什么是更好的做法:存储字符串或使用关系?
问题描述
好吧,我必须自己选择哪种做法更好用。我试图解释我的意思。例如,我有表Songs
:
Id | Name | Artist | Year
---+------+--------+-------
1 | Ad | Bad | 2015
2 | Sad | ads | 2011
3 | Wad | Had | 2012
而且,我想实现 table Playlists
。而且我不完全知道,哪种做法会更好。
方法 #1 - 使用字符串存储歌曲 ID
Playlists
桌子:
Id | Name | Songs
---+------+------------------------
1 | Main | 1,2
2 | GYM | 4,6,7,8,53,65,76878,78,
3 | Rock | 121,434,655,6767,78
因此,为了获取某些播放列表存储的歌曲,我会在每次从 DB 生成列表时对其进行解析。
方法 #2 - 使用多对多关系策略
Playlists
桌子:
Id | Name
---+------
1 | Main
2 | GYM
3 | Rock
PlaylistSongs
桌子:
Id | PlaylistId | SongId
---+------------+---------
1 | 1 | 1
2 | 1 | 2
4 | 1 | 344
5 | 1 | 45
6 | 1 | 57
方法 3 - 你的建议
如果您知道更好的做法,请随时与我分享:)
感谢关注!
解决方案
PlaylistSongs
-- 多对多关系 -- 是存储数据的正确方式。以下是一些原因:
- SQL 表中的列应该包含一个值,而不是多个值。
- 歌曲在不同的播放列表之间共享。他们是他们自己的实体。您还需要有关每首歌曲的其他信息(例如发行时间、类型等)。
- 数字不应作为字符串存储在关系数据库中;它们应该存储为某种数字类型。
- 应该在表之间正确声明外键关系。
- SQL 具有(通常)非常糟糕的字符串解析函数。
- SQL 可以优化以正确格式存储的数据。
推荐阅读
- r - 如何处理面板数据上最纯的错误
- java - 有没有办法测试移动数据的可用性(如果启用它不保证我连接到互联网)?
- sap-cloud-platform - SuccessFactors 目标的密钥库位置上的 DestinationAccessException
- c++ - 在编译时而不是运行时创建一个由两个字节组成的值
- r - 增加Shiny中bsPopover制作的文本框的宽度
- php - Wordpress Dequeue 本地化脚本不起作用
- netlogo - 如何让海龟在 Netlogo 中沿着特定路径移动?
- python - 按索引数组对 numpy 数据进行排序(数据和索引都可能包含`np.nan`!)
- html - Firefox 和 Chrome 的高度差
- cuda - “CUDA 驱动程序版本不足以支持 CUDA 运行时版本” - 但事实并非如此