0

情况如下:

假设我有一个 Dog 模型和一个 Vaccination 模型(因此,一个存储 Dogs 行的表和一个存储给 Dog 的 Vaccinations 行的表)。

所以,一只狗has_many接种疫苗和一只狗接种疫苗belongs_to

我希望能够快速回答这个问题:“狗 A 上一次接种疫苗是什么时候?” 有两种方法可以存储这些数据:

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

2)非标准化数据库方式:在Dog中有一个名为“last_vaccination”的字段,每次给Dog A接种疫苗时都要维护这个字段。

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

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

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

4

2 回答 2

4

我非常喜欢几年前在一次软件研讨会上从数据库专家那里听到的一句话:

“规范化直到它受伤,反规范化直到它起作用。”

这其中有很多道理。

FWIW,我认为上面的布局中有一个漏洞——需要一个“疫苗接种”表,实际上,它将狗与疫苗联系起来。疫苗接种!=疫苗。这是标准化版本的更准确表示。国际海事组织。

于 2012-09-30T03:02:18.423 回答
0

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

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

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

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

Rails.cache.fetch("dogs/#{@dog.id}/last_vaccination") do
  @dog.vaccinations.last
end
于 2012-09-30T03:01:36.287 回答