仅部分地以相同的方式获取记录

时间:2013-08-29 17:14:24

标签: database database-design logic

在浏览9gag.com时,我想到了一个想法(问题)。让我们说我想创建一个网站,用户可以在其中添加不同类型的条目。现在每个条目都是不同的类型,需要不同的/附加列。

让我们说我们可以添加:

  • youtube video
  • 需要引用作者姓名和姓氏的引用
  • 一款需要额外游戏类别,描述,类型等的Flash游戏。
  • 需要链接的图片

现在以上所有都是条目并且有一些共同的列(如id,add_date,adding_user_id等等)和一些不同/附加(例如:只有flash游戏需要描述或者只有图像需要plus_18列到被指定)。问题是我应该如何组织数据库/代码来控制上述所有条目?我可能想订购它们,或者通过add_date等搜索条目......

出现在我脑海中的想法:

  1. 添加"类型" column,指定它是什么条目,并添加允许NULL的所有可能列,与此特定类型列无关。但这是非常讨厌的。没有数据集成。
  2. 添加一些包含附加数据的序列化数据的列,但它会使任何过滤完全地狱。
  3. 为条目创建主(父)表,为具体条目类型(其附加列/信息)创建单独的表。但在这里,我甚至不知道我应该如何正确地选择数据,也只是讨厌。
  4. 那么解决这个问题的最佳方式是什么?

1 个答案:

答案 0 :(得分:1)

父表似乎是最佳选择。

// This is the parent table
Entry
  ID PK
  Common fields

Video
  ID PK
  EntryID FK
  Unique fields

Game
  ID PK
  EntryID FK
  Unique fields

...

查询的外观在很大程度上取决于查询的类型。例如,要获得按特定日期排序的所有游戏,查询将类似于:

SELECT *
FROM Game
JOIN Entry ON Game.EntryID = Entry.ID
ORDER BY Entry.AddDate

要按日期排序所有内容,将会有些混乱。例如:

SELECT *
FROM Entry
LEFT JOIN Game ON Game.EntryID = Entry.ID
LEFT JOIN Video ON Video.EntryID = Entry.ID
...
ORDER BY Entry.AddDate

如果您想运行上述查询,我​​建议您为主键字段(即VideoIDGameID)指定唯一名称,这样您就可以轻松识别出哪种类型的条目了重新处理(通过检查GameID IS NOT NULL)。

或者您可以在Type中添加Entry字段。