我想为事件设计一个数据库并跟踪它的大量统计数据。
选项1
为Events
创建一个表,并将所有统计列放入其中。像男性的数量,女性的数量,不明性别的数量,当天的温度,开始的时间,任何打架,被警察打电话等等。
查询将是一个非常简单的select * from events
选项2
创建两个表,一个用于Events
,另一个用于EventsAttributes
。在Events
表中,我会存储重要的内容,例如id,事件标题和开始/结束时间。
在EventsAttributes
中,我会存储所有事件统计信息,并使用Events
外键将其链接回eventId
。
查询如下所示。 (attributeType == 1
代表男性人数)
select e.*,
(select ev.value from EventAttributes ev where ev.eventId = e.id and attributeType = 1) as NumberOfMale
from Events e
查询不会像选项1一样直截了当,但我想以正确的方式设计它并使用凌乱的查询。
那么哪个选项是正确的方法,以及为什么(我不是数据库管理员,但很好奇)。
感谢您的时间。
答案 0 :(得分:0)
我更喜欢使用选项2来设计数据库。
在该选项(2)中,您应用了数据库规范化的最佳实践。
规范化数据库有三个主要原因:
第一个是尽量减少重复数据。
第二个是最小化或避免数据修改问题
第三是简化查询。
有关详情,请参阅Designing a Normalized Database
您可以根据此规范化数据库创建视图(查询)以支持选项(1)。
通过这种方式,数据库可以为将来的任何扩展做好准备。
<强>更新强>
您可以使用有价值的运算符pivot和公用表表达式(CTE)来获取eventAttributes1,eventAttributes2,...
假设您的表是:events和event_attributes,如下所述:
events
----------
# event_id
event_title
start_date
end_date
event_attributes
-------------
#event_id
#att_type
att_value
# is primary key
-- using table expression (it's like a dynamic view)
with query as (
select e.event_id, e.event_title,a.att_type, a.att_value
from events e
join event_attributes a on e.event_id =a.event_id
)
select event_id , event_title,
[1] as eventAttributes1, -- list all eventAttributes1 numbered [1],[2],...
[2] as eventAttributes2
[3] as eventAttributes3
FROM query
PIVOT(SUM(att_value) FOR att_type IN ([1],[2],[3])) as pvt
有关透视读取的详细信息:Using PIVOT