【问题标题】:Heterogeneous type of items in one master-child relationship一个主子关系中的异构项目类型
【发布时间】:2012-03-11 08:28:08
【问题描述】:

可能以前有人问过这个问题,但找不到一个好的答案:我有一个主表,它可能与异构实体存在一对多的关系。最好用一个例子来描述它:

我有音频播放列表的主表 (tb_playlist)。播放列表可以包含节目片段 (tb_episode)、歌曲 (tb_songs) 或音频报道 (tb_reportae)。我知道最不利于数据完整性的简单设计是这样的:

**tb_playlist** 
(
playlist_id,
audioitem_id [can be episode_id, song_id, reportage_id],
audioitem_type [can be: episode, song, or reportage]
)

上述解决方案显然没有强制数据完整性,替代可能是空列,如下所示:

**tb_playlist** 
(
playlist_id,
episode_id, 
song_id, 
reportage_id
)

但后者不利于扩展音频项目类型。

问题是解决这个问题的最佳方法是什么?

非常感谢!

【问题讨论】:

    标签: sql-server database database-design


    【解决方案1】:

    我认为您应该为问题创建一个实体关系图。我知道你有一个层次结构:一个 PlayList 可以有许多 PlayListItemsPlayListItems 分为三种(这里是我看到的层次结构):EpisodesSongsReportages

    查看此问题以了解如何处理层次结构:What is the best database schema to support values that are only appropriate to specific rows?

    【讨论】:

    • 我无法上传图片,因为我是 stackoverflow 的新手。你的理解是正确的。播放列表可以有多个项目,每个项目可以是来自不同表(歌曲、剧集和报告文学)的外键。三个表中的每个表都是一个独立的实体,具有自己的属性。
    • 恐怕我无法从您的帖子中得到正确答案。我知道每种解决方案都有优缺点。我想保留所有桌子而没有任何杀戮(我已经受够了全世界的杀戮)。所以我的问题是:我应该为 item_id 和 item_type 选择单列,还是应该选择可为空的外键.. 或者是否有更好的解决方案,不包括任何杀戮......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-01
    • 2014-09-14
    相关资源
    最近更新 更多