存储完整/部分表的历史记录

Use*_*293 6 mysql innodb

我正在使用 Django 和 MySQL (InnoDB) 构建一个 Web 应用程序,目前正在考虑如何管理各种表上的历史更改。

我想知道在那些没有改变的行上存储大量带有 NULLS 的行是否有效。例如,这是我的产品表的简单表示;

在此处输入图片说明

products_history表的所​​有字段(FK和非逻辑行除外)都设置为NULL,而普通products表的NOT NULL所有字段都设置为,除了description

现在我想到的是推送实际产品行的副本并将更改推送到products_history表中。所以假设我有这一行products

{600, CURRENT_TIMESTAMP, 2, 'BS001', NULL, 49.95}
Run Code Online (Sandbox Code Playgroud)

并将价格更改为48.50。所以我会推送哪些值发生了变化,在这种情况下base_price,将更改行添加到历史表中;

{600, THE_date_created_FROM_PRODUCT, NULL, NULL, 49.95}
{600, CURRENT_TIMESTAMP, NULL, NULL, 48.50}
Run Code Online (Sandbox Code Playgroud)

因此,在第一次修改产品时,它将获得 2 行,之后每次修改只有一个新的修改字段)。之后它将product使用新的base_price.

这种方法对我有用并且非常有效(因为只有第一次实际编辑产品时,历史表才会填充产品数据),但我想知道通过存储所有这些 NULL 值是否有效。一段时间后它会影响我的表现还是影响不会那么大?

除此以外; 我很好奇在 MySQL 中这样做的好方法,甚至是 Django ORM 特定的方法。

小智 0

回答您的存储 NULL 问题:存储 NULL 值/性能

在建立这样的历史模型时,您确实需要注意历史数据的用途......例如,我是否需要这些数据来进行历史报告、琐碎的查找、指标/分析、公司数据合规性(名单还在继续)?

如果不需要基于上述的历史数据,那么只需根据基表进行 CRUD 并添加“modified_at” | “modified_by”等字段表示最近的更改以及更改的内容,即“System”、“UserId”等。

如果历史模型是必要的或业务需求,那么通过添加所需的字段来推断历史表,这将使您的审计和序列化处于困境,即“modified_at”等...另外使用 MySQL 触发器 MySQL 触发器和示例

触发器将允许您通过利用条件片段和 NEW.* / OLD.* 语法来操纵历史记录中需要/想要的数据。通过这样做,您可以根据个人用例限制存储到数据页的 NULL 值。出于数据保留原因,请确保阅读触发操作之前/之后的信息。