情况如下:
假设我有一个Dog模型和一个Vaccination模型(所以,一个存储狗行的表和一个存放了一排狗的疫苗接种表。)
所以,狗has_many
接种疫苗和接种疫苗belongs_to
狗。
我希望能够迅速回答这个问题:“狗狗A最后一次接种疫苗是什么时候?”存储此数据的方法有两种:
1)规范化数据库方式:让Vaccine表存储一切。要回答这个问题,请在数据库中搜索给予A A的所有接种疫苗,并返回最近的疫苗接种。
2)未标准化的数据库方式:在Dog中有一个名为“last_vaccination”的字段,并在每次给狗A接种疫苗时保持该字段。
#1的优点是:您可以获得数据库规范化,而不必担心维护准确的数据。
#2的优点是:性能 - 您不必每次都在搜索疫苗数据库。
这样做的正确方法是什么?
答案 0 :(得分:4)
我非常喜欢多年前在软件研讨会上听到数据库人员的一句话:
“标准化直到它受伤,非规范化直到它起作用。”
很多事实。
FWIW,我认为上面的布局有一个漏洞 - “疫苗接种”表需要在那里实际上将狗与疫苗联系起来。接种疫苗!=疫苗。这是标准化版本的更准确表示。 IMO。
答案 1 :(得分:0)
就个人而言,我在这种情况下已经意识到的一件事是:
如果您发现需要在另一个表中持续存储聚合或“最新记录”信息(并打破规范化),主要是出于性能目的,那么您真正需要的是缓存,不 a列/表。
选择你的毒药:一个简单的内存缓存,分布式缓存或对你的RDBMS的NoSQL补充。
在您的特定情况下,可能可行的最简单的事情可能类似于:
Rails.cache.fetch("dogs/#{@dog.id}/last_vaccination") do
@dog.vaccinations.last
end