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

时间:2015-04-06 19:32:17

标签: mysql ruby-on-rails database database-performance

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

输入1
摘要(文字)
目标(文字)

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

类型3
title(varchar)
内容(文字)

类型4
title(varchar)
介绍(文字)
问题(varchar)

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

  1. 使用包含所有幻灯片类型列的单个表格,并使用指定幻灯片类型的附加列
  2. 使用包含仅用于共享数据类型的列的单个表,并为每个非标准字段使用其他表(我认为Drupal是这样做的,不是吗?)
  3. 每种幻灯片类型使用不同的表格
  4. 问题
    2&每当我想为单个训练组装所有幻灯片时,3将需要大量的表连接,而#1将导致该表具有包含许多NULL值的列。我该如何权衡这些问题呢?针对这种情况是否有标准的最佳实践指南?

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

1 个答案:

答案 0 :(得分:1)

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

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

类型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

现在,每张幻灯片都应该能够提出与之相关的问题,以便每张幻灯片都有一个问题。这样,如果您需要在其他地方使用它们,或者由于活动记录而以面向对象的方式更改了飞行问题,您可以稍后将幻灯片与幻灯片取消关联。

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