我计划为商业智能系统设计一个数据库模型,该系统存储一组位置和一组年份的业务数据。
其中一些数字应根据同一年份和同一地点的其他数字计算得出。在下文中,我将把未计算的数字称为“基本数字”。为了存储基本数字,具有这些列的表格设计是有意义的:
| year | location_id | goods_costs | marketing_costs | warehouse_costs | administrative_costs |
使用此表,我可以创建一个计算所有其他必要数字的视图:
CREATE VIEW all_figures
SELECT *,
goods_costs + marketing_costs + warehouse_costs + administrative_costs
AS total_costs
FROM basic_figures
如果我没有遇到以下问题,那就太好了:
- 大多数数据库(包括我打算使用的 MySQL [编辑:但我不受约束])都有某种列数或行大小限制。由于我必须存储很多数字(并且必须计算更多),我会超过这个限制。
- 必须添加新数字的情况并不少见。(添加一个图形需要更改表格设计。由于这些更改通常表现不佳,它们会在很长一段时间内阻止对表格的任何访问。)
- 我还必须为每个数字存储附加信息,例如描述和单位(所有数字都是十进制数字,但有些可能是美元/欧元,而其他可能是百分比)。如果有任何变化,我必须确保 basic_figures 表、all_figures 视图和包含图形信息的表都正确更新。(这更像是一个数据规范化问题,而不是技术/实施问题。)
~~
因此我考虑使用这个表设计:
+---------+-------------+-------------+-------+
| year | location_id | figure_id | value |
+---------+-------------+-------------+-------+
| 2009 | 1 | goods_costs | 300 |
...
这种类似实体属性值的设计可能是这三个问题的第一个解决方案。然而,它也有一个新的缺点:计算变得混乱。真是乱七八糟。
要构建与上述类似的视图,我必须使用这样的查询:
(SELECT * FROM basic_figures_eav)
UNION ALL
(SELECT a.year_id, a.location_id, "total_costs", a.value + b.value + c.value + d.value
FROM basic_figures_eav a
INNER JOIN basic_figures_eav b ON a.year_id = b.year_id AND a.location_id = b.location_id AND b.figure_id = "marketing_costs"
INNER JOIN basic_figures_eav c ON a.year_id = c.year_id AND a.location_id = c.location_id AND c.figure_id = "warehouse_costs"
INNER JOIN basic_figures_eav d ON a.year_id = d.year_id AND a.location_id = d.location_id AND d.figure_id = "administrative_costs"
WHERE a.figure_id = "goods_costs");
这不是美女吗?请注意,这只是对 ONE 数字的查询。所有其他计算的数字(其中有很多我上面写的)也必须与这个查询联合。
~~
在对我的问题进行了长时间的解释之后,我现在以我的实际问题结束:
- 您会建议哪种数据库设计?/ 你会使用上述两种设计中的一种吗?(如果是,是哪个,为什么?如果不是,为什么?)
- 您对完全不同的方法有什么建议吗?(我会非常非常感谢!)
- 毕竟数据库真的应该是进行计算的那个吗?将计算转移到应用程序逻辑并简单地存储结果是否更有意义?
顺便说一句:我已经在 MySQL 论坛上问过类似的问题。但是,由于答案有点稀疏,而且这毕竟不仅仅是 MySQL 问题,所以我完全重写了我的问题并将其发布在这里。(所以这不是一个交叉帖子。)这是那里的线程链接: http://forums.mysql.com/read.php?125,560752,560752#msg- 560752