SQL2005:本サイトにリンクテーブルに複数のテーブルおよび保持参考完全性?

StackOverflow https://stackoverflow.com/questions/19516

質問

ここでは簡略化のデータベース:

Table: Property
Fields: ID, Address

Table: Quote
Fields: ID, PropertyID, BespokeQuoteFields...

Table: Job
Fields: ID, PropertyID, BespokeJobFields...

そして、他のテーブルに関連する 見積もりジョブ テーブルです。

私を追加する必要があり メッセージ テーブルがユーザー録画できる電話のメッセージに関連するお客様からのお仕事となります

私のような二つの同一のテーブル(QuoteMessageJobMessageこの違反に乾元らしい汚.

私のような一 メッセージ テーブル:

Table: Message
Fields: ID, RelationID, RelationType, OtherFields...

この停から利用の制約の執行っ参考ます。もできますforseeで作成問題のdevlopment側を使用Linq to SQLます。

はありまエレガントな解決方法にこの問題は、私が最終的につくろう。

役に立ちましたか?

解決

を一つのメッセージテーブルを含む独自のMessageIdの様々な特性が必要店舗用するものとします。

Table: Message
Fields: Id, TimeReceived, MessageDetails, WhateverElse...

の作成につリンクテーブル-QuoteMessageとJobMessage.これかを含む二つの分野それぞれ外部キーの見積もり/Jobのメッセージ。

Table: QuoteMessage
Fields: QuoteId, MessageId

Table: JobMessage
Fields: JobId, MessageId

このように使って定義されるデータの特性のメッセージを一つの場所だけで簡単に延長し、クエリのすべてのメッセージがあるかもしれませんを参照整合性の連携を引用および雇用へのメッセージ数.確かに、見積もりと職サイトでは、 メッセージをくなった場合は適切なビジネスモデルがありますが、少なくとも、データモデルのオプション)。

他のヒント

約のその他の方を考えることができるが、ベースメッセージテーブル、両方のIdとTypeId.おsubtables(QuoteMessageとJobMessage)を参照のテーブルの両MessageId、TypeIdがもチェックを制約している強みをappropiate MessageTypeId.

Table: Message
Fields: Id, MessageTypeId, Text, ...
Primary Key: Id, MessageTypeId
Unique: Id

Table: MessageType
Fields: Id, Name
Values: 1, "Quote" : 2, "Job"

Table: QuoteMessage
Fields: Id, MessageId, MessageTypeId, QuoteId
Constraints: MessageTypeId = 1
References: (MessageId, MessageTypeId) = (Message.Id, Message.MessageTypeId)
            QuoteId = Quote.QuoteId

Table: JobMessage
Fields: Id, MessageId, MessageTypeId, JobId
Constraints: MessageTypeId = 2
References: (MessageId, MessageTypeId) = (Message.Id, Message.MessageTypeId)
            JobId = Job.QuoteId

これを購入すとの比較でJobMesssageとQuoteMessageす。で輌のメッセージへの第一級の市民できるように読みすべてのメッセージからのシングル。引換、クエリーパスからのメッセージで関連する取引の仕事は1以上の参加です。このようなお客様のアプリに流れるかどうかも決して悪くはないのですがトレードオフはいません。

(2)に関しては同一のテーブルに違反し乾燥-かわしました。DB設計で以上に、乾燥についての詳ノーマライゼーション場合は2あるとしているもモデリングと同じ属性カラム)なのか、実際に異なるもの(テーブル)-で合理的に複数のテーブルとの類似が含まれています。よく逆のmunging異なるものです。

@焼

Ianの答え(+1)を修正 [注].を多くの多くのテーブル QUOTEMESSAGE への参加 QUOTEMESSAGE 最も正しいモデルで親を亡くし MESSAGE 記録です。

このうちのひとつで 珍しい 場合にトリガを使用できます。しかし、注意する必要を保証するために適用されるのは、シングル MESSAGE 記録できない関連するとともに、その QUOTEJOB.

create trigger quotemessage_trg
on quotemessage
for delete
as
begin

delete 
from [message] 
where [message].[msg_id] in 
    (select [msg_id] from Deleted);

end

注イアンもあると思いますが商品につけられたタのテーブル定義 JobMessage, の柱すべき JobId, MessageId (?).私は編集積がかか数年を得るレベルの対応が評判!

なぜならず両方のQuoteIdとJobId分野でのメッセージテーブルは?又はメッセージをいに関してはお見積りは仕事とは?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top