【发布时间】:2015-04-06 13:14:16
【问题描述】:
我设计了一个以短链接行为中心的数据库。
我有以下架构:
create_table "students", force: :cascade do |t|
t.string "first_name"
t.string "last_name"
t.string "email"
t.boolean "recruit", default: true
t.boolean "archive", default: false
t.datetime "created_at"
t.datetime "updated_at"
end
create_table "fields", force: :cascade do |t|
t.string "name"
t.integer "index"
t.integer "group_id"
t.string "description"
t.string "options"
t.boolean "hidden"
t.boolean "locked", default: false
t.datetime "created_at"
t.datetime "updated_at"
end
create_table "groups", force: :cascade do |t|
t.string "name"
t.datetime "created_at"
t.datetime "updated_at"
end
create_table "texts", force: :cascade do |t|
t.integer "student_id"
t.integer "field_id"
t.string "content", default: ""
t.datetime "created_at"
t.datetime "updated_at"
end
create_table "options", force: :cascade do |t|
t.integer "student_id"
t.integer "field_id"
t.string "choice", default: ""
t.datetime "created_at"
t.datetime "updated_at"
end
create_table "addresses", force: :cascade do |t|
t.integer "student_id"
t.integer "field_id"
t.string "address_1", default: ""
t.string "address_2", default: ""
t.string "city", default: ""
t.integer "state_id", default: 1
t.string "zip", default: ""
t.datetime "created_at"
t.datetime "updated_at"
end
这个组织背后的基础是一种完全灵活的形式。您只需在字段表中添加一个新行,该条目就会在生成学生的表单上定义一个新问题。组是指选项字段、文本字段或地址。保存数据后,与给定字段关联的组会告诉我的应用程序将其放入哪个表中。该系统运行良好。它超级灵活,我可以很容易地查看哪些学生有特定选项的数据,并且我几乎可以根据任何内容进行查询。
问题是当我开始展示学生时。我首先查询要显示的学生,然后我必须搜索每个学生的每个字段。这意味着对于 500 名学生,我在一个基本表单上大约有 2500 个查询。这会扼杀性能。
我想知道将查询连接在一起并加速该系统的最佳方法是什么?
部分问题是我不能 100% 确定学生有给定的字段,所以当我现在查询时,如果数据库没有返回结果,我可以创建一个。
【问题讨论】:
标签: sql ruby-on-rails ruby database postgresql