如何为相关内容类型构建数据库
How to architect a database for related content types
我正在建立一个提供培训课程的网站。每个培训都由一系列培训幻灯片组成。目前有 4 种不同的幻灯片类型,但这可以扩展。幻灯片类型具有以下数据(括号中的类型):
类型 1
摘要(文本)
目标(文字)
类型 2
标题(varchar)
副标题 (varchar)
类型 3
标题(varchar)
内容(文本)
类型 4
标题(varchar)
简介(文字)
问题 (varchar)
我不确定在数据库中构建它的最佳方法是什么。我看到以下可能的选项:
- 使用包含所有幻灯片类型的列的单个 table,以及指定幻灯片类型的附加列
- 使用一个仅包含共享数据类型列的 table,并为每个 non-standard 字段使用额外的 table(我认为 Drupal 是这样做的,不?)
- 每种幻灯片类型使用不同的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
我正在建立一个提供培训课程的网站。每个培训都由一系列培训幻灯片组成。目前有 4 种不同的幻灯片类型,但这可以扩展。幻灯片类型具有以下数据(括号中的类型):
类型 1
摘要(文本)
目标(文字)
类型 2
标题(varchar)
副标题 (varchar)
类型 3
标题(varchar)
内容(文本)
类型 4
标题(varchar)
简介(文字)
问题 (varchar)
我不确定在数据库中构建它的最佳方法是什么。我看到以下可能的选项:
- 使用包含所有幻灯片类型的列的单个 table,以及指定幻灯片类型的附加列
- 使用一个仅包含共享数据类型列的 table,并为每个 non-standard 字段使用额外的 table(我认为 Drupal 是这样做的,不?)
- 每种幻灯片类型使用不同的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