バックグラウンド:
私はバイテンポラル データベースを設計しています。ここでは、バイテンポラル テーブル間に 1:N の関係があります (M:N の関係もありますが、それらはコネクタ テーブルと 2 つの 1:N の関係でモデル化されているだけなので、それらは特別なものだと考えています)。 1:N 関係の場合)。
物事を説明するために、2 つのテーブルを持つ単純なケースを考えてみましょう。
|===============| |==================|
| tblOrder | | tblOrderItem |
|============== | |==================|
| - OrderId | | - OrderItemId |
| - OrderNumber | | - FK_OrderId |
|===============| | - Amount |
|==================|
FK_OrderId
への外部キーtblOrder
です。
このデータベース モデルをバイテンポラルにするために、次の設計を考え出しました。
|===============| |==================| |====================|
| tblOrder | | tblOrderItem | | tblVersions |
|============== | |==================| |====================|
| - Id | | - Id | | - VersionId |
| - OrderId | | - OrderItemId | | - VersionDate |
| - OrderNumber | | - FK_OrderId | |====================|
| - VersionId | | - Amount |
| - IsDeleted | | - VersionId |
| - StartDate | | - IsDeleted |
| - EndDate | | - StartDate |
|===============| | - EndDate |
|==================|
説明:
VersionId
列はtblVersions
テーブルへの外部キーです。tblVersions
データベースが変更されるたびに、テーブルにエントリが作成されます。データの現在の状態は、すべてのバージョンの合計になります。WHERE VersionDate < ...
これにより、(節を介して) データベースの以前の状態を再構築することができます。これは、バイテンポラリティのトランザクション時間ディメンションです。- VersionDate`
tblVersions table could also be avoided if we're just including the
列を 2 つのデータ テーブルに挿入します。 StartDate
およびEndDate
列は、バイテンポラリティーの有効な時間次元です。はい、EndDate
ちょっと冗長です。 だけでテーブルをモデル化できStartTime
ます。- 2 つのテーブルの
Id
列が新しい主キーです。同じエンティティに対して複数の行があるため (複数のバージョン、複数の有効期間の日付範囲)、エンティティの ID をテーブルの主キーにすることはできません。列OrderId
と列OrderItemId
はエンティティの ID ですが、テーブルの主キーではありません。新しい主キーを作成する代わりにId
、主キーを として定義することもできます(OrderId, VersionId, StartDate)
。 - エンティティが削除された場合は、新しいバージョン エントリと、エンティティ テーブル内の エントリを作成するだけ
IsDeleted = 1
です。テーブル内の他のすべてのエントリ (挿入と更新) にはIsDeleted = 0
. - の列はの列
FK_OrderId
をtblOrderitem
参照しています。これは、もはや主キーではないため、(データベースの制約という意味で) 本当の外部キーではありません。しかし、どの OrderItems が特定の Order の一部であるかはまだわかります。OrderId
tblOrder
OrderId
これはうまくいくようです。必要な CRUD クエリを作成し、バイテンポラル データを読み書きできるようになりました。
質問:
それが一貫して機能するためには、どのような制約が必要ですか?
制約を実装する方法には興味がありません (制約をFOREIGN KEY
s またはUNIQUE
制約、またはTRIGGER
s、またはCHECK
s などのデータベース制約として実装するかどうか)。必要な制約の種類を知る必要があるだけです。
私は答えとして投稿するつもりの制約の束を見つけました。しかし、おそらくもっとありますか?