是否有必要针对给定方案对数据库进行反规范化?

时间:2014-05-23 15:30:32

标签: mysql database-design denormalization

我做了一个简单的cms。

每个帖子都有主题,内容和几个图像,并使用2个表

每次创建新帖子时,都要插入表格主题和内容,然后插入表格b图像,但如果插入表格b失败,则必须删除最后一个插入表格。
更新和删除时都会发生问题。

表a

article
id    subject    content
1     

表b

article_image
id    article_id    file_path    file_sequence
1     1             dkeorkw.jpg  2
1     1             dklwekw.jpg  1

我想知道我应该结合2个表,任何建议吗? 大多数人怎么做

3 个答案:

答案 0 :(得分:1)

因为事务管理的东西你无法避免结构。你不应该组合表格。如果你今天要避免这件事,明天就会有大量的反规范化数据。之后,管理数据将非常困难。您将在数据库中的更多位置拥有一个数据。所以我不会再命令这样做。大多数框架本身都提供事务管理。我不知道您使用的是哪种框架和技术,但Spring(在Java中)非常容易提供。

答案 1 :(得分:1)

  

大多数人该怎么做

您不应该将这两个表组合在一起,因为您以后会遇到问题。大多数人做了标准化。见database normalization

大多数数据库系统都带有一些机制,允许您在其中一个语句失败时进行事务处理和回滚。您可以在documentation

中详细了解MySQL如何处理这个问题
START TRANSACTION;
INSERT ...;
INSERT ...;
COMMIT;

答案 2 :(得分:1)

您应该在事务中执行插入操作。这样,如果其中一个失败,它们都会被取消。

例如

START TRANSACTION;
INSERT INTO article (...) VALUES (...);
INSERT INTO image (...) VALUES (...);
INSERT INTO article_image (...) VALUES (...);
COMMIT;

如果由于某种原因导致任何插入失败,则DB中不会出现任何插入。