我正在为我的多媒体收藏创建一个数据库,我发现自己对我的设计有疑问,这让我想知道是否有更有效的方法来实现我想要的。
我正在尝试以分层方式设计数据库。我不会把它全部包括在内。
主要的父表名为MONOLITH。它有BLOCK_ID和BLOCK_NAME作为属性 行是:
1," INDEX"
2," LIBRARY"
然后两个子表是INDEX和LIBRARY。前者用于电影,后者用于电视节目。
我开始怀疑数据库的完整性是因为电影和电视节目的数据不同,两者都需要相同的属性,所以我认为它们应该在不同的表格中。所以在INDEX表中,每一行的外键都是1,而在LIBRARY表中,每一行的外键都是2.这有什么明显的错误或是否有不同的方法来实现我想要的?这只是一个小例子,还有音乐,文本,有声读物和安装文件,它们都是MONOLITH表中的子项。它们中的每一个都将分别具有相同的外键。
非常感谢任何帮助,谢谢!
答案 0 :(得分:1)
您观察到表格中包含有关音乐,文本等实际信息的链接到整体表格是多余的。就你的描述而言,那个monolith表是多余的,因为它不包含任何无法从其他表中提取的信息。您不需要实现数据库的内容列表。任何与音乐,文本,视频等有关的查询都应直接转到包含它们的表格。如果您需要索引,请在这些表中定义它们。
您希望通过标题获取所有电影,音乐作品等,也不需要该单片表。您可以通过类似
之类的方式实现这一目标select id, name, "movie"
from movies
where name like "Singing%"
union
select id, name, "music"
from music
where name like "Singing%"
总而言之,您的monolith方法(相当不寻常)看起来像是可以留给数据库的自定义实现,比如维护索引。
您的文件子文件夹备注指向您希望为媒体片段设置流派系统的方向。在数据库中,表达此信息的最佳方式不是通过单独的表,而是首先有一个表
Genre(id, name, supergenre_id)
可用于表达类似
的类型层次结构1 Pop null
2 Brit-Pop 1
3 Italo-Pop 1
4 Classical null
5 Baroque 4
...
然后只有每个媒体的genre_id属性。使用数据库比使用文件系统更灵活。文件夹结构只允许表达一个层次结构,而对于这种数据库方案,您可能有许多,例如心情,仪器等,除了流派。这就是让数据库变得有趣的原因。
答案 1 :(得分:1)
整体表不用于任何目的。正如您在问题语句中所描述的那样,子表的每一行都将具有与外键列完全相同的值,这不是外键的含义。为了满足您的要求,您可以定义一个视图,其中包含此子表中的所有公共属性。
SELECT * FROM multimedia_collection
WHERE name LIKE 'STAR WARS%'
现在,您可以针对此视图触发不同的查询。例如,要查找包含名称STAR WARS的所有多媒体项目,您可以触发以下查询。
SELECT media_type, count(*) FROM multimedia_collection
GROUP BY media_type
要查找每种多媒体类型的计数,您可以触发以下查询。
{{1}}
这些只是一些示例,您可以在定义视图后执行更多操作。