我正在研究应用程序的简单数据库设计。 我有一个Book Illustrator和Editor表。
之间的关系使用此模型,我认为这是每个author
editor
和illustrator
表格中列名称的重复。
如果书籍作者,插图画家和编辑人员相同,在这种情况下,数据会在3个表格中重复。
但是在搜索的情况下它会更快,我想因为每张桌子上没有项目会更少。
建模2
通过这种建模,所有作者,插图画家和编辑器信息都保存在一个表中,我很困惑这个表的名称应该是什么。
采用这种方法。与模型1相比,数据不会重复,但搜索量将翻倍。
有人可以建议我选择哪种型号。我觉得造型2更好。
答案 0 :(得分:1)
纯粹取决于您的品味,您应该使用哪种型号。第二个的优点是你不会得到重复。使用这两种模型,您可以通过一个查询获得结果
select * from books
left join names auth ON (auth.id = author_id)
left join names ill ON (ill.id = illustrator_id)
left join names ed ON (ed.id = editor_id)
where books.id = 1;
SQLFiddle给出了模型2的示例。如果要从模型1获取数据,只需将3个连接更改为右表。
如果要显示作者列表,我建议不要在名称表中将其添加为新字段,而只需使用联合查询。
select auth.* from books
left join names auth ON (auth.id = author_id)
只要您在id
,author_id
,illustrator_id
和editor_id
上设置索引,就没事了。
编辑:我的偏好会转到模型2.我认为它可能会更快一点:
答案 1 :(得分:0)
您可以通过保留用户类型列来对您提出的第二个设计进行一次修改,该列描述用户是否是作者,插图画家和编辑者中的任何一个。 id将在0 - 7之间变化,您可以存储按位数据的十进制值。好像一个人是编辑&那么作者,
1(Editor) 0(Illustrator) 1(Author) => 5
因此,当您在该表上执行任何选择/搜索时,您可以添加用户在查询中输入的过滤器。
答案 2 :(得分:0)
例如,您是否需要验证作者是否被定义为"作者"在你作为作者链接到一本书之前? 您是否愿意进行查询以了解数据库中定义的所有作者/编辑/插图画家是谁?
您已在实体之间创建了N-N链接,但是,您拥有" auhorId"," editorId"和" illustatorId"在" Book"实体!
正确的方法是通过另一个表来解决多对多关系,并最终得到类似的东西
如果您需要在链接到图书之前验证参与者是作者,编辑,插图画家,您需要在此处添加三个标记给参与者:IS_AUTHOR,IS_EDITOR,IS_ILLUSTRATOR
希望这有帮助