2つの派生エンティティが同じスーパータイプインスタンスを共有できないようにするためのテーブル継承があります。 AccessとMS SQL Serverなどの
データベースはPostgreSQLがないかのようなテーブルの継承をサポートしていませんが、あなたのことができ、偽のそれ:
このスキーマは
Parent
または
Children
エンティティは、単一の特定なしでは存在できないことを意味し
TABLE Users (
UserId int PRIMARY KEY IDENTITY(1,1),
UserName nvarchar(50) NOT NULL,
PasswordHash binary(32) NOT NULL, -- assuming sha256
PasswordSalt binary(8) NOT NULL
)
TABLE Parents (
UserId int NOT NULL PRIMARY KEY,
-- insert parent-specific fields here
FOREIGN KEY UserId REFERENCES Users (UserId)
)
TABLE Children (
UserId int NOT NULL PRIMARY KEY,
-- insert child-specific fields here
FOREIGN KEY UserId REFERENCES Users (UserId)
)
User
エンティティも存在します。しかし、Accessは実際のテーブル継承をサポートしていないので、またはChildren
の行だけがその値を持つように、とChild
の値が同じUserId
の値を持つように、の値を簡単に制約できません。
幸いにも、(関係代数に関しては)数学的に正しいハッキングがありますが、残念ながらスーパークラス(User
)がサブクラスを認識しているという点で残念ながらOOPの側面が壊れています。状況...
...とにかく。秘密のサブクラスを特定するUser
の主キー(複合キーなので)にenum値を追加し、それぞれの "派生"テーブルで一致する定数(CHECK CONSTRAINT
を介して適用される)複合キーコンポーネントを追加し、わずかな非効率性のコストでそう
ENUM UserType (HumanParent = 1, HumanChild = 2, Other = 3)
TABLE Users (
UserId int IDENTITY(1,1),
UserType UserType NOT NULL,
UserName nvarchar(50) NOT NULL,
PasswordHash binary(32) NOT NULL, -- assuming sha256
PasswordSalt binary(8) NOT NULL
PRIMARY KEY (UserId, UserType)
)
TABLE Parents (
UserId int NOT NULL,
UserType UserType NOT NULL,
-- insert parent-specific fields here
PRIMARY KEY (UserId, UserType)
FOREIGN KEY (UserId, UserType) REFERENCES Users (UserId, UserType)
CHECK CONSTRAINT UserType = 1
)
TABLE Children (
UserId int NOT NULL,
UserType UserType NOT NULL,
-- insert child-specific fields here
PRIMARY KEY (UserId, UserType)
FOREIGN KEY (UserId, UserType) REFERENCES Users (UserId, UserType)
CHECK CONSTRAINT UserType = 2
)
(: - のようなので、(リレーショナル代数は、ポータブルですが、列挙型のような概念とチェック制約が非常によく、MS Accessに必ずしもポートをない擬似-SQLを使用して)つまり、UserType
列に必要な余分なストレージと、CHECK制約を評価するための計算コスト)があれば、データの正確性が保証されます。
これで楽しくアクセスできます:)
同じ情報を表す複数のエンティティがあるため、データベース設計が正規化されていません。 – Dai
このデータベースはどのようなものですか?エンティティは何を表していますか? – Dai
@Dai人名、姓などの基本情報より現実的かもしれない別のバージョンの表を追加しましたが、私はまだフィードバックを待っています。 – Higeath