2016-10-11 7 views
3

私は本質的にMS SQL Server 2016の会計処理/小売りアプリケーションです。私はそれぞれ〜75のコアデータオブジェクトタイプを持っています。 、組織、請求書、支払いなど)。私が作成する必要がどのような通知のために複数のテーブルにあるすべての行のグローバルIDを作成する

は、通知システムで、

例えば

NotificationTypes:

id message 
11 "{0} paid invoice {1]" 
12 "{0} purchased product {1]" 
... 

と、2つの対応する表を持って、私は「通知タイプ」テーブルだっ作成するために何が起こっていたかなど、「ボブは、製品のXYZを購入した」「スティーブは、請求書1234を支払いました」各通知イベントの情報、およびその通知メッセージの値を格納します。だから、 "スティーブは、請求書1234を支払った" ため、たとえば:

NotificationEvent:

id notificationType (FK) occured 
21 11      2016-01-01 00:00:00 

NotificationEventValues:私はNotificationEventValues.XXXXXのために、一般的な外部キーを作成することはできませんので、今

id notificationEvent (FK) XXXXX 
31 21      (FK reference to Steve in users table) 
32 21      (FK reference to invoice 1234 in invoices table) 

、私がいました私は持っているすべての75のデータ型のFK列を持つ単一の 'dataObjects'表を持っていますが、 'data type'列の1つには行ごとに値があります。

この方法では、データベースのデータオブジェクトのすべてのインスタンスは、通知フィールドで参照できる一意のIDを持っています。つまり、他の75個のテーブルの基本的にすべての行に対してユニークなIDを持っています。他の欠点は、すべてのユーザー、請求書、任意の 'データオブジェクト'のための手段であることです。スペースが他の74個のヌル値の列のID参照用に予約されるため、かなりのスペースが無駄になります(固定サイズID変数ではありません)。

はASK:
すべてのテーブル間での私の「グローバル」の識別子を達成するためのより良い方法はありますか?または、この問題を回避する通知システムを処理するためのより良い方法は?

+0

グローバルIDを使用しないでください:あなたは以下にクエリ似た記述する必要が対応するレコードを取得するための

。私たちは大きなプロジェクトの一つでそれを行い、私たちが望んでいなかったことを望みます。 –

+0

その代わりに何を使いましたか? – walshy002000

+0

大きなシステムを変更することはできません。しかし、あなたは本当に数字が完全なDB上でユニークである必要がありますか? –

答えて

0

テーブルにレコードを挿入するすべてのテーブルでトリガーを作成すると、レコードがいずれのテーブルにも挿入されるたびにプリミティブキーとなる1つの列キーがあります。このテーブルに挿入される値は_の形式になります。例えば、idが1のユーザーテーブルにレコードが挿入されている場合、KeyMasterテーブルに挿入されたレコードは 'user_1'になります。同様に、idが1の請求書テーブルにレコードが挿入されている場合、KeyMasterテーブルに挿入されたレコードは 'invoice_1'になります。

NotificationEventValuesテーブルには、id、notificationEvent、およびkey(KeyMasterテーブルへのFK参照)という3つのカラムしか必要ありません。

select * 
from NotificationEventValues n 
inner join users u on 'user_' + u.id = n.key 
関連する問題