gpt4 book ai didi

mysql - 存储对实体的更改 : Is MySQL the proper solution?

转载 作者:IT老高 更新时间:2023-10-29 00:21:27 25 4
gpt4 key购买 nike

我想将我所做的更改存储在我的“实体”表上。这应该像一个日志。目前在 MySQL 中是用这个表实现的:

CREATE TABLE `entitychange` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`entity_id` int(10) unsigned NOT NULL,
`entitytype` enum('STRING_1','STRING_2','SOMEBOOL','SOMEDOUBLE','SOMETIMESTAMP') NOT NULL DEFAULT 'STRING_1',
`when` TIMESTAMP NOT NULL,
`value` TEXT,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
  • entity_id = 我的 entity 表的主键。
  • entitytype = entity 表中已更改的字段。有时只更改一个字段,有时更改多个字段。一次更改 = 一行。
  • value = 字段“新值”的字符串表示形式。

将字段 entity.somedouble 从 3 更改为 2 时的示例,我运行这些查询:

UPDATE entity SET somedouble = 2 WHERE entity_id = 123;
INSERT INTO entitychange (entity_id,entitytype,value) VALUES (123,'SOMEDOUBLE',2);

我需要选择过去 15 天的特定实体和实体类型的变化。例如:在过去 15 天内,entity_id 123 的最后一次更改为 SOMEDOUBLE

现在,我不喜欢两件事:

  1. 所有数据都存储为 TEXT - 尽管大多数(少于 1%)不是真正的文本,但在我的例子中,大多数值是 DOUBLE。这是个大问题吗?
  2. 表格在插入时变得非常非常慢,因为表格已经有 2 亿行。由于这个原因,目前我的服务器负载高达 10-15。

我的问题:我该如何解决这两个“瓶颈”?我需要扩展。

我的方法是:

  1. 这样存储:http://sqlfiddle.com/#!2/df9d0 (点击浏览) - 将更改存储在 entitychange 表中,然后根据其数据类型将值存储在 entitychange_[bool|timestamp|double|string]
  2. 使用 HASH(entity_id) 进行分区 - 我想到了大约 50 个分区。
  3. 我应该使用其他数据库系统,比如 MongoDB 吗?

最佳答案

如果我遇到你提到的问题,我会设计如下的LOG表:

  1. EntityName:(字符串)正在被操作的实体。(强制)
  2. ObjectId:被操作的实体,主键。
  3. FieldName:(字符串)实体字段名称。
  4. OldValue:(字符串)实体字段旧值。
  5. NewValue:(字符串)实体字段新值。
  6. UserCode:应用程序用户唯一标识符。 (强制)
  7. TransactionCode:任何更改实体的操作都需要具有唯一的事务代码(如 GUID)(强制),
    如果实体更新更改多个字段,这些列将是跟踪更新(事务)中所有更改的关键点
  8. ChangeDate:交易日期。 (强制)
  9. FieldType:枚举或显示字段类型的文本,如 TEXT 或 Double。 (强制)

采用这种方法
可以跟踪任何实体(表)
报告将是可读的
只会记录更改。
事务代码将是检测更改的关键点一个 Action 。

顺便说一句

Store the changes in the entitychange table and then store the value 
according to its datatype in entitychange_[bool|timestamp|double|string]

不需要,在单个表中您将有更改和数据类型

Use partitioning by HASH(entity_id)

我更喜欢按 ChangeDate 分区或为 changeDate 创建足够老的备份表,以便从主 LOG 表中备份和删除

Should I use another database system, maybe MongoDB?

任何数据库都有其自身的优缺点,您可以在任何 RDBMS 上使用该设计。MongoDB 等基于文档的数据库的有用比较 could be found here

希望对您有所帮助。

关于mysql - 存储对实体的更改 : Is MySQL the proper solution?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17042760/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com