如何为相关内容类型构建数据库

How to architect a database for related content types

我正在建立一个提供培训课程的网站。每个培训都由一系列培训幻灯片组成。目前有 4 种不同的幻灯片类型,但这可以扩展。幻灯片类型具有以下数据(括号中的类型):

类型 1
摘要(文本)
目标(文字)

类型 2
标题(varchar)
副标题 (varchar)

类型 3
标题(varchar)
内容(文本)

类型 4
标题(varchar)
简介(文字)
问题 (varchar)

我不确定在数据库中构建它的最佳方法是什么。我看到以下可能的选项:

  1. 使用包含所有幻灯片类型的列的单个 table,以及指定幻灯片类型的附加列
  2. 使用一个仅包含共享数据类型列的 table,并为每个 non-standard 字段使用额外的 table(我认为 Drupal 是这样做的,不?)
  3. 每种幻灯片类型使用不同的table

问题
2 & 3 需要很多 table 加入任何时候我想 assemble 所有幻灯片进行个人培训,而 #1 会导致 table 列有很多 NULL值。我应该如何权衡这些问题?是否有针对这种情况的标准最佳实践指南?

其他注意事项
- Slide Type 4 还将有一个与之相关的 multiple-choice 问题,以及与每个答案选择相关的不同反馈(例如,用户选择并回答,反馈会在屏幕上弹出)。 - 我正在 Rails 中构建它。也不确定这是否重要。 - 我不希望我的网站有超过 1000 张幻灯片,但我很想知道幻灯片的数量如何影响最佳方法。

鉴于类型 2、类型 3 和类型 4 都有相似之处,我认为只制作一个幻灯片类型并根据幻灯片重用名称是值得的。您甚至可以将类型指定为 table 的一部分。然后,在展开幻灯片时,只需将幻灯片 table 向上迁移到新值即可。我唯一认为这是一个糟糕的想法是,如果您期望数据库中有过多的值。例如,如果您有数百万张幻灯片,那么浪费的数据量可能是个问题,但对于简化逻辑的简单解决方案,一个 table 是最好的。

这是我对这个所谓的幻灯片 table 的迁移的建议。

类型 2、3 和 4 共享 slide_title 即标题

目标、内容和介绍都是文本,因此在我看来可以分享。它们也是通用描述,因此类型将决定它的含义。所以,这叫做 slide_description.

create_table :slides do |t|
  t.column :slide_id, :string, :limit => 36, :null => false
  t.column :slide_title, :string, :limit => 64
  t.column :slide_description, :text
  t.column :slide_goals, :text
  t.column :slide_summary, :text
  t.column :slide_type, :integer, :null => false
  t.column :created_at, :datetime
  t.column :updated_at, :datetime
end

现在,每张幻灯片都应该能够有与之关联的问题,以便每张幻灯片 has_one 有问题。这样,如果您需要在其他地方使用它们,或者由于活动记录,以 object 导向的方式更改飞行问题,您可以在以后将问题与幻灯片分离。

create_table :questions do |t|
  t.column :question_id, :string, :limit => 36, :null => false
  t.column :question_title, :string, :limit => 64

  //Other things for questions

  t.column :created_at, :datetime
  t.column :updated_at, :datetime
end