0

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

假设我们可以添加:

  • 一个 youtube 视频
  • 需要引用的作者姓名和姓氏的引用
  • 需要额外游戏类别、描述、类型等的 Flash 游戏。
  • 需要链接的图像

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

我脑海中浮现的想法:

  1. 添加一个“类型”列,指定它是什么条目,并添加所有可能的列,其中允许 NULL 与此特定类型列无关。但这是非常讨厌的。没有数据集成。
  2. 为附加数据添加一些带有序列化数据的列,但它使任何过滤都成为地狱。
  3. 为条目创建主(父)表,并为具体条目类型(它们的附加列/信息)创建单独的表。但在这里我什至不知道我应该如何正确选择数据,而且也很讨厌。

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

4

1 回答 1

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例如通过检查)。

或者您可以TypeEntry.

于 2013-08-29T17:37:12.733 回答