【发布时间】:2017-09-22 13:44:29
【问题描述】:
我需要在数据库中创建日志表。每个日志都有不同的参数。这是我想出的桌子设计。
Table Log
============
ID(INT)
Action(INT)
Created(TIMESTAMP)
Table Parameter
================
ID(INT)
ActionID(INT)
Title(VARCHAR(50))
VALUE(VARCHAR(300))
我的问题是,我需要对这个日志表执行复杂的查询,例如
- 谁做了什么动作,什么时候做的?
如果title = "personID",这意味着我需要检查参数,以及我需要检查动作代码是什么意思。
- 销售操作的总价格
对于这个,我需要检查“销售”的操作代码(比如 3(作为整数)),然后我需要用标题检索该操作的参数“价格”,然后将它们加倍并求和。
此查询将扩展,我需要确保我的设计可以回答更复杂的查询。我知道索引会带来很大的提升,但我不太确定需要在哪里添加才能充分利用数据库引擎。底层数据库是 MySQL。
哪些字段应该有索引?或者我的设计是否符合我的目的?我也在使用 InnoDB 引擎。
编辑
示例 SQL
SELECT LOG.ID, LOG.ACTION, LOG.CREATED FROM LOG, PARAMETER
WHERE PARAMETER.ACTIONID = ACTION.ID AND
PARAMETER.TITLE = "PERSONNAME" AND
PARAMETER.VALUE = 'JOHN' AND
PARAMETER.TITLE = "PRICE" AND
(CAST(PARAMETER.VALUE AS DOUBLE) > 30.0) AND
PARAMETER.TITLE = "DATE" AND
(CAST(PARAMETER.VALUE AS TIMESTAMP) > (NOW() - INTERVAL 1 DAY)))
我们拥有的条件越多,SQL 中使用的Parameter.TITLE 和Parameter.VALUE 对就越多。
【问题讨论】:
-
在看到
SELECT之前无法确定索引。 -
@RickJames 我已经用一个可能的查询编辑了这个问题。
标签: mysql database logging indexing entity-attribute-value