Feedというテーブルがあります。このテーブルは、ユーザーが作成したさまざまなタイプ(写真、イベント、ステータスなど)のソーシャルオブジェクトを追跡します。今、私は2つのデザインの選択肢があります。
選択1:objectTypeId、objectId:
CREATE TABLE [dbo].[Feed](
[feedId] [int] IDENTITY(1,1) NOT NULL,
[objectTypeId] [int] NULL,
[objectId] [datetime] NOT NULL
)。
CREATE TABLE [dbo].[ObjectType](
[typeId] [int] IDENTITY(1,1) NOT NULL,
[name] [NVARCHAR] NULL
)。
オブジェクトタイプは、すべての可能なタイプのリストを保持します。しかし、私はこの方法が嫌いです。理由は、データベースに参照整合性を強制できないためです。
テーブルの1つでオブジェクトが削除された場合、FeedのobjectId値は存在しないオブジェクトを指しています。
さらに、ここでのJoinステートメントは混乱しています。LEFT JOIN Events ON feed.objectTypeId = 2 AND feed.objectId=Events.eventIdなどのハード値を使用してテーブルをハードコーディングする必要があります。
選択肢2:eventId NULL、photoId NULL、statusId NULL、またはその他のobjectTypeIdをフィードテーブルに追加します
PRO:参照整合性を適用できます。ヌル列は何も格納しないため、それほど問題にはなりません。追加のオブジェクトタイプテーブルを作成する必要はありません。
CREATE TABLE [dbo].[Feed](
[feedId] [int] IDENTITY(1,1) NOT NULL,
[eventId] [int] NULL,
[photoId] [int] NULL,
[statusId] [int] NULL,
)
しかし、このテーブルは実際には正規化されているとは感じていません。
だから、私がやろうとしていることを実行し、私の目標を達成するための最良の方法は何ですか。新しいオブジェクトタイプを追加するたびにスキーマを変更する必要のない参照整合性。
アップデート:
それらのオブジェクトのテーブルが存在することを指摘するのを忘れました...私はテーブルを持っています
CREATE TABLE [Events](
eventId INT、イベントのみを処理する他の列。)。
CREATE TABLE [Photos](
photoId INT、写真のみを扱う他の列)
CREATE TABLE [Status](
statusId INT、ステータスのみを処理する他の列)