对如何为清单应用程序

时间:2016-02-02 06:45:40

标签: database database-design relational-database database-schema

我有一个清单应用程序,我正在尝试为其设计数据库。

清单由一组标签(清单的部分)组成,每个标签都有许多checklist_items。可以启动并完成清单。完成后,用户可以在之后创建新的核对表。我正在尝试设计数据库,但令我困惑的是我如何设计它以便我可以查询类似的内容:

在创建的所有清单中,“家庭”标签上的项目已被检查了多少?

我有一个初步设计:

enter image description here

当我创建我的第一个清单时,我的选项卡表格如下:

tab_id, checklist_id, name
1,      1,            "Household"
2,      1,            "Outdoors"
3,      1,            "Work"
4,      1,            "School"

我的checklist_item标签如下:

   checklist_item_id, checklist_id, tab_id, checked
   1,                 1,            1,      0
   2,                 1,            1,      0
   3,                 1,            1,      0
   4,                 1,            2,      0
   5,                 1,            2,      0
   6,                 1,            2,      0
   7,                 1,            3,      0
   8,                 1,            3,      0
   9,                 1,            3,      0
   10,                1,            4,      0
   11,                1,            4,      0
   12,                1,            4,      0

清单项只知道tab_id,当有多个清单时,它就不像说select from checklist_item where tab_id = 1那么容易,因为家里会有更多的标签条目,所以我怎么能找到像查询上面?还有,到目前为止我的设计是不是很糟糕?有没有更好的方法来解决这个问题?

编辑:值得一提的是我是数据库设计的新手

2 个答案:

答案 0 :(得分:0)

你的桌子很好。您仍然可以使用查询SELECT * FROM checklist_item WHERE tab_id = 1,因为tab_id唯一地确定了checklist_id(即每个选项卡属于特定的清单),因此不同清单的Household条目之间不会有任何混淆(每个清单都有自己的tab_id)

如果您希望在所有清单中获取「家居」项目,请将checklist_item加入标签,如下所示:

SELECT i.*
FROM checklist_item i
INNER JOIN tab t ON i.tab_id = t.tab_id
WHERE t.name = 'Household'

答案 1 :(得分:0)

我用http://www.w3schools.com/sql/sql_join.asp

学到了它

我认为你错过了查询中的联接。

SELECT CI.checklist_item_id, CIchecked, T.checklist_ID, T.name, C.time_started, C.time_ended
FROM checklist_item CI 
LEFT JOIN tab T ON CI.tab_id = T.tab_id 
LEFT JOIN checklist C ON CI.checklist_id = C.checklist_id
WHERE tab_id = 1