作者热门文章
- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我想将我所做的更改存储在我的“实体”表上。这应该像一个日志。目前在 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
。
现在,我不喜欢两件事:
TEXT
- 尽管大多数(少于 1%)不是真正的文本,但在我的例子中,大多数值是 DOUBLE
。这是个大问题吗?我的问题:我该如何解决这两个“瓶颈”?我需要扩展。
我的方法是:
entitychange
表中,然后根据其数据类型将值存储在 entitychange_[bool|timestamp|double|string]
HASH(entity_id)
进行分区 - 我想到了大约 50 个分区。 最佳答案
如果我遇到你提到的问题,我会设计如下的LOG表:
EntityName
:(字符串)正在被操作的实体。(强制)ObjectId
:被操作的实体,主键。FieldName
:(字符串)实体字段名称。OldValue
:(字符串)实体字段旧值。NewValue
:(字符串)实体字段新值。UserCode
:应用程序用户唯一标识符。 (强制)TransactionCode
:任何更改实体的操作都需要具有唯一的事务代码(如 GUID)(强制),ChangeDate
:交易日期。 (强制)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/
我是一名优秀的程序员,十分优秀!