1

と の 2 つのテーブルがHouseありPictureます。Pictureテーブルには、との列homepageがあります。これが意味することは、家には写真があり、 としてフラグが付けられた写真だけがホームページに表示されるということです。boolhouse_idhomepage

問題: 家ごとに 1 つのホームページの画像しかない。または:タプル(house_id, homepage):(1, False)は 1 つしか存在できません。(house_id, homepage):(1, True)どうすればそれをPostgreSQLで機能させることができますか?

そのような状況の名前はありますか?(1, False)多くのタプルが存在する可能性があるため、これはもちろん主キーではありません。

データベースのソリューションが役立ちます。ボーナス ポイント: Django のモデル レイヤーでそれを実装する方法についてのソリューションは素晴らしいでしょう!

4

1 に答える 1

1

常にデータの整合性を保証したい場合は、DB レベルで解決できます (解決する必要があります)。さまざまな方法がありますが、パーシャル UNIQUE INDEXがおそらく最も単純で効果的です。

CREATE UNIQUE INDEX picture_homepage_uni ON picture (house_id) WHERE homepage;

->sqlfiddle

副次的な利点として、ホームページの写真を取得するためのクエリも高速化されます。

スキーマの変更

別のアプローチは、選択した画像を指す列homepage_idを tableに追加することです。house自動的に、1 つの画像のみを選択できます。もう必要ありpicture.homepageません。参照整合性は、双方向の外部キー制約のために少し難しいかもしれませんが、私はそのような実用的な解決策を持っています.

于 2013-02-23T15:15:48.770 に答える