数据库设计(连接3个表)



我的目标是创建一个显示我国选举结果的web应用程序。

数据是每个城市每个候选人在每次选举中的结果。

  • 选举有许多候选人和许多城市。
  • 一个候选人有多个选举和多个城市。
  • 一个城市有很多选举和候选人。上届总统选举第二轮投票:
<表类> 城市 inscrits votants exprime candidate1 得分C1 candidate2 得分C2 tbody><<tr>第戎12900010000080000长音符号50000勒庞30000里昂1000000900000750000长音符号450000勒庞300000

要实际将这些模型联系在一起并记录所需的数据,您需要一系列表来记录您感兴趣的每个级别的选举结果:

# rails g model national_result candidate:belongs_to election:belongs_to votes:integer percentage:decimal
class NationalResult < ApplicationRecord
belongs_to :candidate
belongs_to :election
delegate :name, to: :candidate,
prefix: true
end
# rails g model city_result candidate:belongs_to election:belongs_to votes:integer percentage:decimal
class CityResult < ApplicationRecord
belongs_to :city
belongs_to :candidate
belongs_to :election
delegate :name, to: :candidate,
prefix: true
end

不应该有C1和C2列,而应该为每个候选人使用一行来记录他们的结果。这将允许您使用相同的表布局,即使有两个以上的候选表(如在主表中),并且避免了确定候选表在哪个列中的问题。使用外键并记录主键,而不是用重复的候选名称填充您的表,这很容易变得非规范化。

你可能会天真地认为"但是我不需要NationalResult,我可以总结所有的LocalResult"。-这个过程实际上会暴露数据集中的任何问题,而且很可能非常昂贵。从一个可重构的源获取数据。

您可以在另一端创建has_many关联:

class Canditate < ApplicationRecord
has_many :local_results
has_many :national_results 
end
class Election < ApplicationRecord
has_many :local_results
has_many :national_results 
end
class City < ApplicationRecord
has_many :local_results
end 

跟踪每次选举/城市的合格选民数量很可能需要另一个表。

最新更新