0

状況は次のとおりです。

犬のモデルと予防接種のモデルがあるとします(つまり、犬の行を格納するテーブルと、犬に与えられた予防接種の行を格納するテーブル)。

だから、犬has_manyの予防接種と犬の予防接種belongs_to

「犬Aが最後に予防接種を受けたのはいつですか?」という質問にすばやく答えられるようにしたいと思います。このデータを保存する方法は2つあります。

1)正規化されたデータベースの方法:Vaccineテーブルにすべてを保存させます。質問に答えるには、犬Aに与えられたすべての予防接種をDBで検索し、最新のものを返します。

2)正規化されていないデータベースの方法:「last_vaccination」というフィールドをDogに設定し、DogAにワクチン接種が行われるたびにこのフィールドを維持します。

#1の長所は、データベースの正規化が可能であり、正確なデータの維持について心配する必要がないことです。

#2の長所は次のとおりです。パフォーマンス-毎回ワクチンデータベースを検索する必要はありません。

これを行う正しい方法は何ですか?

4

2 に答える 2

4

私は、何年も前にソフトウェアシンポジウムでDBの人から聞いた言葉の大ファンです。

「痛むまで正規化し、機能するまで非正規化します。」

その中にはたくさんの真実があります。

FWIW、上のレイアウトには穴があると思います。「ワクチン接種」テーブルがそこにある必要があります。これは、事実上、犬をワクチンに結び付けるものです。予防接種!=ワクチン。これは、正規化されたバージョンのより正確な表現です。IMO。

于 2012-09-30T03:02:18.423 に答える
0

個人的に、このような状況で私が気づいたことの1つは次のとおりです。

主にパフォーマンスの目的で、集計情報または「最新のレコード」情報を別のテーブルに常に格納する(および正規化を破る)必要がある場合、実際に必要なのは列/テーブルではなくキャッシュです。

ポイズンを選択します。単純なインメモリキャッシュ、分散キャッシュ、またはRDBMSを補完するNoSQLです。

あなたの特定のケースでは、おそらく機能する可能性のある最も単純なものは次のようになります。

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