データベース (具体的には SQL Server 2005) で継承を使用する方法はありますか?
すべてのエンティティに追加したいCreatedOn、CreatedByのようなフィールドがほとんどないとします。これらのフィールドをすべてのテーブルに追加する代わりに、別の方法を探しています。
データベース (具体的には SQL Server 2005) で継承を使用する方法はありますか?
すべてのエンティティに追加したいCreatedOn、CreatedByのようなフィールドがほとんどないとします。これらのフィールドをすべてのテーブルに追加する代わりに、別の方法を探しています。
SQL Server 2005 にはテーブル間の継承のようなものはありません。他の人が指摘したように、テーブルを作成するときに必要な列をテーブルに追加するためのヘルプを得ることができますが、それは継承ではありません。それを知っている。
ソース コード ファイルのテンプレートのようなものと考えてください。
GateKiller が言及しているように、共有データを含むテーブルを作成し、それを外部キーで参照できますが、監査フックやトリガーを用意するか、手動で更新する必要があります。
結論:手作業。
PostgreSQL にはこの機能があります。これをテーブル定義の最後に追加するだけです:
INHERITS FROM (tablename[, othertable...])
子テーブルにはその親のすべての列が含まれ、親テーブルを変更すると子も変更されます。また、子テーブルのすべてが、親テーブルへのクエリで表示されます (デフォルト)。残念ながら、インデックスは親子の境界を越えません。つまり、特定の列が親と子の両方で一意であることを確認できません。
私の知る限り、これはあまり頻繁に使用される機能ではありません。
GUIDを使用している場合は、列がGUID、CreatedOn、CreatedByのCreateHistoryテーブルを作成できます。テーブルにデータを入力するには、テーブルごとにトリガーを作成するか、アプリケーションロジックで処理する必要があります。
これを行うために継承を使用したくない!テーブルB、C、およびDがテーブルAから継承する場合、これは、テーブルAにクエリを実行すると、B、C、およびDからのレコードが得られることを意味します。
から削除;
継承の代わりに、代わりにLIKEを使用してください...
CREATE TABLE blah (
blah_id serial PRIMARY KEY
, something text NOT NULL
, LIKE template_table INCLUDING DEFALUTS
);
特定のテーブルに監査列を追加し、(オプションで) 履歴テーブルと関連するトリガーを作成して値の変更を追跡する SProc があります。残念ながら、会社のポリシーにより共有できませんが、実際に達成することは難しくありません。
Management Studio のテンプレート ペインでテンプレートを作成できます。そして、新しいテーブルを作成するたびにそのテンプレートを使用します。
それができない場合は、元のテーブルと ID を参照する監査証跡テーブルに CreatedOn フィールドと CreatedBy フィールドを格納できます。
それができない場合は、手動で行います。
ER/Studio や ERWin などのデータ モデリング ツールを使用できます。どちらのツールにも、任意のテーブルに適用できる列テンプレートを定義できるドメイン列があります。ドメインが変更されると、関連する列も変更されます。ER/Studio には、作成して任意のテーブルに適用できるトリガー テンプレートもあります。これは、何百ものトリガー スクリプトを作成して維持することなく、LastUpdatedBy 列と LastUpdatedDate 列を更新する方法です。
監査テーブルを作成すると、監査テーブルを使用するすべてのテーブルのすべての行に対して 1 つの行が作成されます。それは面倒になる可能性があります。私の意見では、すべてのテーブルに監査列を配置する方がよいでしょう。すべてのテーブルにタイムスタンプ列を配置することもできます。並行性がいつ問題になるかはわかりません。すべてのテーブルに配置する DB 監査列は、CreatedDt、LastUpdatedBy、LastUpdatedDt、および Timestamp です。
お役に立てれば。
OR マッピングでは、親テーブルと子テーブルが同じ識別子を使用する親テーブルに継承がマップされます。
例えば
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 に対して外部キー関係を持っています。サブオブジェクト行を作成するときは、最初にオブジェクト行を作成し、両方の行で Id を使用する必要があります
Ramesh - I would implement this using supertype and subtype relationships in my E-R model. There are a few different physical options you have of implementing the relationships as well.