1

UserCityおよびの3 つのフィールドを持つテーブルがありCountry、フィールドの1 つだけNULLが常に非である必要があります。これに SQL 制約を使用できますか、それとも自分のしていることを再考する必要がありますか?

シナリオは、ユーザー、都市、または国に添付できるドキュメントをデータベースに含める必要があるというものです。したがって、このテーブルの行には、ユーザー、都市、または国のいずれかのドキュメントが 1 つだけ含まれています。ただし、どのエンティティに「添付」されているかに関係なく、すべてのドキュメントも検索できる必要があります。

JOIN代わりに 3 つの異なるテーブルを使用しない理由は、3 つの場所すべてでドキュメントを検索するときに 3 つのテーブルを使用する必要がないようにしたいからです。ここで使用しようとしている種類の非正規化によってパフォーマンスが向上すると想像していますが、よくわかりません。

考え?

4

5 に答える 5

1

私が正しく理解していれば、次の SQL は探している制約を追加する必要があります。

ALTER TABLE YourTableName
ADD CONSTRAINT CK_TestNullCount 
    CHECK (Case When [user] is NULL Then 0 Else 1 End 
           + Case When City Is NULL Then 0 Else 1 End 
           + Case When Country Is NULL Then 0 Else 1 End = 1)
于 2010-03-09T17:32:12.350 に答える
0

CHECK CONSTRAINTでそれを実行できるかどうかはわかりません-私は遊んでいますが、最終的には実際には何も機能しないようです:-(

ただし、これらの条件をチェックするために、いつでもテーブルにINSTEAD OF INSERT(および場合によっては)トリガーを作成できます。これらの条件が満たされない場合は、RAISERRORを使用して例外をスローすると、行は挿入(または更新)されません。INSTEAD OF UPDATE

于 2010-03-09T17:20:59.957 に答える
0

FKシナリオに固執することをお勧めします。これが、ドキュメントが1つだけに関連付けられていることを確認する方法DocumentTypeです(あなたが添付していると呼んでいるもの)。

これが非常に単純化された関係です。ドキュメントテーブルにすでに3つの列があることはわかっていますが、それをFKにすることを検討してください。 代替テキスト

次に、有効な値の範囲でドキュメントタイプをロードします。

代替テキスト

データを挿入するときは、型をintではなくvarcharとして記述します。これによってパフォーマンスの問題が発生することはなく、非正規化されたスキーマのレポートなどに役立ちます。

代替テキスト

于 2010-03-09T17:23:45.347 に答える
0

それらを、列 LocationID、LocationName、および (必要に応じて) LocationType (User、City、Country) を持つ単一のテーブル Locations に配置します。ドキュメントの「場所」を検出するために必要な結合は 1 つだけであり、場所の名前を取得するためにどのフィールドを選択するかを心配する必要はありません。

この手法を使用すると、null 以外の単純な外部キー制約を使用して、「唯一無二」の場所の要件を適用できます。

于 2010-03-09T17:07:04.193 に答える
-1

LocationIdと呼ばれる列とLocationTypeIdと呼ばれる列の2つの列がないのはなぜですか。次に、3つのテーブルすべてに左結合できます。

SELECT COALESCE(User.Name, City.Name, Country.Name) 
FROM Location
INNER JOIN LocationType ON Location.LocationTypeId = LocationType.LocationTypeId
LEFT JOIN User ON Location.LocationId = User.Id AND Location.LocationTypeId = 1
LEFT JOIN City ON Location.LocationId = City.Id AND Location.LocationTypeId = 2
LEFT JOIN Country ON Location.LocationId = Country.Id AND Location.LocationTypeId = 3
于 2010-03-09T17:13:17.297 に答える