什么时候没有规范化的数据库?

时间:2012-09-30 02:53:11

标签: ruby ruby-on-rails-3 activerecord normalization

情况如下:

假设我有一个Dog模型和一个Vaccination模型(所以,一个存储狗行的表和一个存放了一排狗的疫苗接种表。)

所以,狗has_many接种疫苗和接种疫苗belongs_to狗。

我希望能够迅速回答这个问题:“狗狗A最后一次接种疫苗是什么时候?”存储此数据的方法有两种:

1)规范化数据库方式:让Vaccine表存储一切。要回答这个问题,请在数据库中搜索给予A A的所有接种疫苗,并返回最近的疫苗接种。

2)未标准化的数据库方式:在Dog中有一个名为“last_vaccination”的字段,并在每次给狗A接种疫苗时保持该字段。

#1的优点是:您可以获得数据库规范化,而不必担心维护准确的数据。

#2的优点是:性能 - 您不必每次都在搜索疫苗数据库。

这样做的正确方法是什么?

2 个答案:

答案 0 :(得分:4)

我非常喜欢多年前在软件研讨会上听到数据库人员的一句话:

“标准化直到它受伤,非规范化直到它起作用。”

很多事实。

FWIW,我认为上面的布局有一个漏洞 - “疫苗接种”表需要在那里实际上将狗与疫苗联系起来。接种疫苗!=疫苗。这是标准化版本的更准确表示。 IMO。

答案 1 :(得分:0)

就个人而言,我在这种情况下已经意识到的一件事是:

如果您发现需要在另一个表中持续存储聚合或“最新记录”信息(并打破规范化),主要是出于性能目的,那么您真正需要的是缓存, a列/表。

选择你的毒药:一个简单的内存缓存,分布式缓存或对你的RDBMS的NoSQL补充。

在您的特定情况下,可能可行的最简单的事情可能类似于:

Rails.cache.fetch("dogs/#{@dog.id}/last_vaccination") do
  @dog.vaccinations.last
end