0

私は2つのテーブルUserとを持っていGroupます。ユーザーとグループが列を持つテーブルAttributes を共有しています:

  • attributeName
  • AttributeValue
  • ObjectID

ObjectIDユーザーの主キーまたはグループの主キーのいずれかを指します。Cascade on Deleteユーザーまたはグループが削除されたときに属性を自動的に削除するために、外部制約を追加しました。

問題は、ユーザーの属性を挿入するときに、グループが存在しないために外部キー制約があることです。

どうすればいいですか?

4

3 に答える 3

2

基本的に 3 つのオプションがあります。

  1. Attribute.ObjectID現在の設計を維持しますが、とUserIDに置き換え GroupID、それぞれに個別の FK をアタッチし (1 つは に向けGroupて、もう 1 つは に向けてUser)、どちらかが NULL になるようにします。また、CHECK 制約を使用して、両方が NULL にならないようにすることもできます。

    ここに画像の説明を入力

  2. AttributeテーブルをUserAttributeとに分割しGroupAttribute、各外部キーを独自のテーブルに分割します。

    ここに画像の説明を入力

  3. 次のように継承を使用します。

    ここに画像の説明を入力

ソリューション (1) は、DBMS が NULL の UNIQUE を処理する方法に大きく依存し、(1) と (2) の両方でAttributeName、ユーザーとグループの 2 つの異なる属性に同じものを使用できます。

于 2012-04-21T13:42:04.150 に答える
1

発見したように、1 つの列を 2 つの異なるテーブルへの外部キーとして持つことはできません。同じ ID を持つグループが存在しない場合、ユーザーの属性を追加することはできません。もちろん、属性がユーザー用かグループ用かはわかりません。

コメントから、ユーザーとグループの間の am:m 関係についても言及したので、次のことをお勧めします。

create table [User]
(
  UserID int identity primary key,
  Name varchar(50) not null
)

go

create table [Group]
(
  GroupID int identity primary key,
  Name varchar(50) not null
)

go

create table UserGroup
(
  UserID int not null references [User](UserID),
  GroupID int not null references [Group](GroupID),
  primary key (UserID, GroupID)
)

go

create table UserAttribute
(
  UserAttributeID int identity primary key,
  Name varchar(50) not null,
  Value varchar(50) not null,
  UserID int not null references [User](UserID) on delete cascade
)

go

create table GroupAttribute
(
  GroupAttributeID int identity primary key,
  Name varchar(50) not null,
  Value varchar(50) not null,
  GroupID int not null references [Group](GroupID) on delete cascade
)

注: 属性テーブルは、事前にわからない属性に対して使用する必要があります。属性になることがわかっているものはすべて、代わりに実際のテーブルのフィールドにする必要があります。顧客定義属性の属性の使用を予約します。

于 2012-04-21T10:07:29.490 に答える
0

ユーザーまたはグループを参照しない = nullの任意の行を挿入できるように、NULLこの外部キー フィールドの値を許可する必要があると思います。ObjectIdObjectId

より良い設計のために、このObjectId列を削除し、新しい列AttributeIdを 2 つのテーブルUserとに追加する必要がありGroupます。

于 2012-04-20T21:50:57.620 に答える