1

テーブルを取り除くことができるかどうかを把握しようとしています。

今、私にはタスクと予定があります。これらのテーブルは両方とも異なる列を持ち、異なる情報を格納しているため、これらのテーブルを結合することはできません。

ただし、タスクと予定ごとに、複数のリマインダーを設定できます (SMS、電子メール、およびその両方で送信)。

現在、2 つの個別のリマインダー テーブルがあります。両方とも、FK を除いて同じ列を持っています。

ここに画像の説明を入力

では、両方に同じテーブルを使用することは可能ですか?

私がそれを確認する唯一の方法は、テーブルに常に両方の FK があるが、一方が常に null であることです (これは間違っているようです)。

ここに画像の説明を入力

4

2 に答える 2

1

このようにできます

Reminder
  - ID
  - ReminderDate
  - EntityID     -- Could be TaskID or AppointmentID
  - EntityType   -- TASK or APPOINTMENT

挿入

INSERT INTO Reminder(@ReminderID, @TaskID, 'TASK') 
INSERT INTO Reminder(@ReminderID, @AppointmentID, 'APPOINTMENT')

選択

SELECT * FROM Reminder WHERE EntityID=@TaskID AND EntityType='TASK' -- Reminders for Task

SELECT * FROM Reminder WHERE EntityID=@AppointmentID AND EntityType='Appointment' -- Reminders for Appointment
于 2012-10-12T23:45:51.910 に答える
0

「それが起こっていることを確認する唯一の方法は、テーブルに常に両方の FK があり、一方が常に null であることです (これは間違っているようです)。」

私はそれで何も悪いとは思いません。それはあなたのビジネスルールです。チェック制約 (2 つの外部キー + 常に 1 つのフィールドが null ではなく、他の 1 つのフィールドが null であってはならないというチェック制約) を使用して、データベース レベルでそれを強制できます。

とにかく、EntityID、EntityTypeトリックIMOを使用するよりも、このソリューションを保持し、適切な外部キーを持つ方がIMOの方が優れています。

データベース機能を使用して、データの整合性を確保します。そうしないと、不良データを取得する可能性が高くなります。コードにいくつかのルールを適用することはできますが、外部キー制約などの DB 機能を使用するよりも、エラーを起こしたり、ビジネス ルールを適用したりする可能性がはるかに高くなります。

于 2012-10-14T19:59:22.710 に答える