数据库优化 - 将每一天存储在不同的列中以减少行数

dca*_*iro 1 database optimization

我正在编写一个应用程序,按用户和日期存储不同类型的记录.这些记录按类别划分.

在设计数据库时,我们创建一个表User,然后为每个记录类型创建一个表RecordType和一个表Record.

示例:要存储与用户事件相关的数据,我们有以下表格:

Event         EventType
-----         ---------
UserId        Id
EventTypeId   Name
Value
Day
Run Code Online (Sandbox Code Playgroud)

我们的老板指出(有某种原因)我们要存储很多行(用户*天)并提出一个对我来说有点疯狂的想法:创建一个包含一年中每一天的列的表,就像所以:

EventTypeId | UserId | Year | 1 | 2 | 3 | 4 | ... | 365 | 366
Run Code Online (Sandbox Code Playgroud)

这样我们每年每个用户只有1行,但我们会得到相当大的行.由于大多数ORM(我们将使用rails3用于此项目)使用select*来获取数据库记录,我们不是要优化某些东西以"去优化"另一个吗?

社区对此有何看法?

Bil*_*win 5

这违反了First Normal Form.这是跨列重复组的示例.

这样做的原因示例:编写查询以查找给定事件发生的日期.你需要一个包含366个术语的WHERE子句,用\n分隔OR.这写起来很乏味,也无法编制索引.

即使您有很多行,关系数据库也可以很好地工作.假设您有10000个用户,平均每个用户每天生成10个事件.10年后,您将拥有10000*366*10*10行或366,000,000行.这是一个相当大的数据库,但并不罕见.

如果您仔细设计索引以匹配针对此数据运行的查询,那么您应该能够长时间获得良好的性能.您还应该有一个分区或存档旧数据的策略.