如何管理数据库表中的实体复制

时间:2017-09-12 07:27:18

标签: mysql database oracle postgresql database-design

我正在研究应用程序的简单数据库设计。 我有一个Book Illustrator和Editor表。

建模1 enter image description here

之间的关系

使用此模型,我认为这是每个author editorillustrator表格中列名称的重复。

如果书籍作者,插图画家和编辑人员相同,在这种情况下,数据会在3个表格中重复。

但是在搜索的情况下它会更快,我想因为每张桌子上没有项目会更少。

建模2

enter image description here 通过这种建模,所有作者,插图画家和编辑器信息都保存在一个表中,我很困惑这个表的名称应该是什么。

采用这种方法。与模型1相比,数据不会重复,但搜索量将翻倍。

有人可以建议我选择哪种型号。我觉得造型2更好。

3 个答案:

答案 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)

只要您在idauthor_idillustrator_ideditor_id上设置索引,就没事了。

编辑:我的偏好会转到模型2.我认为它可能会更快一点:

  1. 数据库只需要打开一个文件(不是3个)
  2. 表中的记录较少(与3个表的组合相比),因为您没有重复记录。
  3. 数据库只需要搜索一个索引集(不是3),并且可能会在后面做一些优化的东西,因为它在同一个集合中寻找3个密钥(而不是3个索引集中的3个密钥) - 这是我的直觉,不确定这是否完全正确......

答案 1 :(得分:0)

您可以通过保留用户类型列来对您提出的第二个设计进行一次修改,该列描述用户是否是作者,插图画家和编辑者中的任何一个。 id将在0 - 7之间变化,您可以存储按位数据的十进制值。好像一个人是编辑&那么作者,

1(Editor) 0(Illustrator) 1(Author) => 5

因此,当您在该表上执行任何选择/搜索时,您可以添加用户在查询中输入的过滤器。

答案 2 :(得分:0)

例如,您是否需要验证作者是否被定义为"作者"在你作为作者链接到一本书之前? 您是否愿意进行查询以了解数据库中定义的所有作者/编辑/插图画家是谁?

您已在实体之间创建了N-N链接,但是,您拥有" auhorId"," editorId"和" illustatorId"在" Book"实体!

正确的方法是通过另一个表来解决多对多关系,并最终得到类似的东西

  1. BOOK,有ID,TITLE,DESC等
  2. PARTICIPANT(所有人的建议名称),有ID,NAME,BIO等
  3. AUTHOR,有BOOK_ID,PARTICIPANT_ID
  4. 编辑,有BOOK_ID,PARTICIPANT_ID
  5. ILLUSTRATORS,有BOOK_ID,PARTICIPANT_ID
  6. OR,而不是(3,4,5),BOOK_PARTICIPANT,有BOOK_ID,PARTICIPANT_ID, PARTICIPATION_TYPE (作者,编辑,插图的代码),甚至使用标志( IS_AUTHOR < / strong>, IS_EDITOR IS_PARTICIPANT ,其中一个需要设置)
  7. 如果您需要在链接到图书之前验证参与者是作者,编辑,插图画家,您需要在此处添加三个标记给参与者:IS_AUTHOR,IS_EDITOR,IS_ILLUSTRATOR

    希望这有帮助