我正在使用 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 值。出于数据保留原因,请确保阅读触发操作之前/之后的信息。
归档时间: |
|
查看次数: |
1343 次 |
最近记录: |