可接受的外键使用

时间:2016-04-28 16:43:45

标签: database-design foreign-keys foreign-key-relationship

我正在为我的多媒体收藏创建一个数据库,我发现自己对我的设计有疑问,这让我想知道是否有更有效的方法来实现我想要的。

我正在尝试以分层方式设计数据库。我不会把它全部包括在内。

主要的父表名为MONOLITH。它有BLOCK_ID和BLOCK_NAME作为属性 行是:

1," INDEX"

2," LIBRARY"

然后两个子表是INDEX和LIBRARY。前者用于电影,后者用于电视节目。

我开始怀疑数据库的完整性是因为电影和电视节目的数据不同,两者都需要相同的属性,所以我认为它们应该在不同的表格中。所以在INDEX表中,每一行的外键都是1,而在LIBRARY表中,每一行的外键都是2.这有什么明显的错误或是否有不同的方法来实现我想要的?这只是一个小例子,还有音乐,文本,有声读物和安装文件,它们都是MONOLITH表中的子项。它们中的每一个都将分别具有相同的外键。

非常感谢任何帮助,谢谢!

2 个答案:

答案 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}}

这些只是一些示例,您可以在定义视图后执行更多操作。