设计数据库以存储包含大量值的记录的最佳方法是什么?

时间:2017-06-19 21:14:17

标签: sql-server database database-design database-table

我想为事件设计一个数据库并跟踪它的大量统计数据。

选项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一样直截了当,但我想以正确的方式设计它并使用凌乱的查询。

那么哪个选项是正确的方法,以及为什么(我不是数据库管理员,但很好奇)。

感谢您的时间。

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

详细信息Using Common Table Expressions