如何设计选举投票数据库

时间:2015-02-20 15:19:49

标签: database relational-database

我想为我的国家设计一个选举数据库,但我在这个问题上以美国为例,并假设美国有30个政党。

共有30个派对。每个州平均有50个州和10个城市(有些州有15个,有些有4个等)。我需要在全国范围内显示每个州和城市的各方比例。

这些是我对设计的看法:

*每一方都有一个单独的表(将有30个表),有2列(州和市)。因此,每个投票都会在州和城市信息中插入相关方的表格,以便查询全国或州/城市的选举结果。但是我必须将每一次投票都插入一行......因为我总是需要每个城市的总票数,所以将每一次投票都插入一行似乎有点过分。

*每个party_city都有一个单独的表,因此查询速度很快(例如,表名:democrats_seattle,democrats_newyork等......)。但这使50x10 = 500桌!!

*每个派对都有一个表格,它只有3列,状态'城市'和' total_votes'。我将在每个表中插入50(州)* 10(城市)= 500行。当用户仅发送投票时,total_votes'将在相关的party-> state-> city行中增加。 例如。

---------------------------------------
|Democrats Table                      |
|-------------------------------------|
|State         City       total_votes |
|-------------------------------------|
|Washington    Seattle    150000      |
|Washington    Medina     100         |
|....          ....                   |
|Wyoming       Cheyenne   50000       |
|Wyoming       Burlington 10000       |
---------------------------------------


--------------------------------------
|Republicans Table                    |
|-------------------------------------|
|State         City       total_votes |
|-------------------------------------|
|Washington    Seattle    50000       |
|Washington    Medina     200000      |
|....          ....                   |
|Wyoming       Cheyenne   50000       |
|Wyoming       Burlington 10000       |
---------------------------------------


 --------------------------------------
|Foo Party Table                      |
|-------------------------------------|
|State         City       total_votes |
|-------------------------------------|
|Washington    Seattle    150000      |
|Washington    Medina     100         |
|....          ....                   |
|Wyoming       Cheyenne   50000       |
|Wyoming       Burlington 10000       |
---------------------------------------

*使用NoSQL数据库更适合这个应用程序吗?

由于

1 个答案:

答案 0 :(得分:1)

为什么不只是一张桌子?

  • 投票表,包括Party,State,City和TotalVotes

这将有大约15,000行,但对于任何现代数据库平台来说都是完全可管理的。

但是,你应该'normalise'设计,所以你最终得到四张桌子;

  • Party table,包含PartyId和PartyName
  • 状态表,包含StateId和StateName
  • 城市表,包含CityId,CityName和StateId
  • 投票表,包含PartyId,CityId和TotalVotes

现在只有ID在主表中,而且它要小得多。将它们连接在一起的SQL非常简单;

SELECT
    p.PartyName,
    s.StateName,
    c.CityName,
    v.TotalVotes
FROM
    Votes v
        INNER JOIN Party p ON p.PartyId = v.PartyId
        INNER JOIN City c ON c.CityId = v.CityId
            INNER JOIN State s ON s.StateId = c.StateId