データベースの継承?
-
08-06-2019 - |
質問
データベース (特に SQL Server 2005) で継承を使用する方法はありますか?
次のようなフィールドがほとんどないとします 作成日, によって作成された これをすべてのエンティティに追加したいと考えています。これらのフィールドをすべてのテーブルに追加する代わりに、別の方法を探しています。
解決
SQL Server 2005 にはテーブル間の継承などはありません。他の人も指摘しているように、テーブルを作成するときにテーブルに必要な列を追加するためのヘルプを得ることができますが、それは継承ではありません。それを知っている。
これはソース コード ファイルのテンプレートのようなものだと考えてください。
GateKiller が述べているように、共有データを含むテーブルを作成し、外部キーでそれを参照することはできますが、監査フックやトリガーを使用するか、手動で更新を行う必要があります。
結論:手仕事。
他のヒント
PostgreSQLにはこの機能があります。これをテーブル定義の最後に追加するだけです。
INHERITS FROM (tablename[, othertable...])
子テーブルには親のすべての列が含まれ、親テーブルを変更すると子も変更されます。また、子テーブル内のすべてのものが親テーブルへのクエリで表示されます (デフォルト)。残念ながら、インデックスは親と子の境界を越えることができません。これは、特定の列が親と子の両方で一意であることを確認できないことも意味します。
私の知る限り、これはあまり頻繁に使用される機能ではありません。
Management Studio のテンプレート ペインでテンプレートを作成できます。その後、新しいテーブルを作成するたびにそのテンプレートを使用します。
それができない場合は、元のテーブルと ID を参照する監査証跡テーブルに CreatedOn フィールドと CreatedBy フィールドを保存できます。
それができない場合は、手動で実行してください。
ER/Studio や ERWin などのデータ モデリング ツールを使用できます。どちらのツールにもドメイン列があり、任意のテーブルに適用できる列テンプレートを定義できます。ドメインが変更されると、関連する列も変更されます。ER/Studio には、作成して任意のテーブルに適用できるトリガー テンプレートもあります。このようにして、何百ものトリガー スクリプトを構築して維持することなく、LastUpdatedBy 列と LastUpdatedDate 列を更新します。
監査テーブルを作成する場合、監査テーブルを使用するすべてのテーブルの各行に 1 つの行が存在することになります。それは面倒になる可能性があります。私の意見では、監査列をすべてのテーブルに配置した方がよいと思います。すべてのテーブルにタイムスタンプ列を配置することもできます。同時実行性がいつ問題になるかはわかりません。すべてのテーブルに配置した DB 監査列は次のとおりです。CreatedDt、LastUpdatedBy、LastUpdatedDt、およびタイムスタンプ。
お役に立てれば。
特定のテーブルに監査列を追加し、(オプションで) 値の変更を追跡する履歴テーブルと関連トリガーを作成する SProc があります。残念ながら、会社の方針により共有することはできませんが、達成するのはそれほど難しいことではありません。
GUID を使用している場合は、列 GUID、CreatedOn、CreatedBy を含む CreateHistory テーブルを作成できます。テーブルにデータを設定するには、テーブルごとにトリガーを作成するか、アプリケーション ロジックでトリガーを処理する必要があります。
これを行うために継承を使用する必要はありません。テーブル B、C、および D がテーブル A から継承している場合、テーブル A をクエリすると、B、C、および D のレコードが取得されることを意味します。今考えてみましょう...
aから削除;
継承の代わりに LIKE を使用してください...
CREATE TABLE blah (
blah_id serial PRIMARY KEY
, something text NOT NULL
, LIKE template_table INCLUDING DEFALUTS
);
Ramesh - E-R モデルでスーパータイプとサブタイプの関係を使用してこれを実装します。関係を実装するために使用できる物理的なオプションもいくつかあります。
O-R マッピングでは、親テーブルと子テーブルが同じ識別子を使用する親テーブルに継承がマップされます。
例えば
create table Object (
Id int NOT NULL --primary key, auto-increment
Name varchar(32)
)
create table SubObject (
Id int NOT NULL --primary key and also foreign key to Object
Description varchar(32)
)
SubObject には Object との外部キー関係があります。SubObject 行を作成するときは、まず Object 行を作成し、両方の行で ID を使用する必要があります。