web-dev-qa-db-ja.com

複雑なリレーショナルデータベースにデータを入力する場合、どの原則に従う必要がありますか?

私はデータベースを初めて使用するので、これが基本的な質問であれば許してください。

私は複雑なオープンソースディクショナリを解析し、データも同様に複雑なAccessデータベースに出力しようとしています。

enter image description here

テーブルにデータを挿入する方法は理解していますが、外部キーを相互に依存する複数のテーブルにデータを挿入する方法がわかりません。簡単な例を挙げましょう:

EntryKeywordKeyword_Priorityの3つのテーブルがあります。すべてのエントリは複数のキーワードを持つことができるので、Keywordテーブルは外部キーを通じてEntryにリンクします。また、各キーワード要素には、キーワードの優先度を説明する複数の要素を含めることができるため、以下のように、Keyword_Priorityテーブルは外部キーを介してKeywordにリンクします。

enter image description here

この単純化されたシナリオで、SQLを使用して新しいエントリを作成するとします。どこから始めますか?私は:

  1. 最初にEntryテーブルに挿入して、新しいEntryIDを作成します

  2. 次に、新しいKeywordを外部キーとして使用してEntryIDテーブルに挿入します

  3. 次に、キーワードのIDフィールドを外部キーとして使用して、Keyword_Priorityテーブルに挿入します

または、別の方法で行う必要があります...

  1. Keyword_Priorityテーブルに挿入

  2. Keywordテーブルに挿入

  3. Entryテーブルに挿入

要約すると、私の質問は:

一度に複数のテーブルにデータを挿入する場合、どこから始めればよいですか?トップダウンからですか、それともボトムアップからですか?

4
Lou

外部キーは、別のテーブルの主キーに関連しています。外部のレコードが入力されると、その主キーを持つ対応するレコードが存在する必要があります。したがって、常にリレーションの片側のテーブル(マスター、親、または主キーテーブル)に挿入することから始める必要があります。次に、リレーションのn側(詳細または子または外部キーテーブル)にレコードを入力できます。

順序:1.エントリ、2。キーワード、3。Keyword_Priority。

テーブルに複数の外部キーがある場合、他のすべてのテーブルの関連レコードと対応する主キーを最初に入力する必要があります。たとえば、SenseRestricted...にレコードを入力する前に、SenseおよびReadingの対応するレコードを挿入しておく必要があります。

いくつかの一般的なアドバイス。画像では、Keyword_PriorityはEntryに依存するKeywordに依存していると思います。したがって、まずエントリから始め、次にキーワードなどにする必要があります。

モデリングの観点からは、モデルのどこで使用するかに関係なく、何かは何かです。エントリはかなりまともです:

CREATE TABLE entry
( EntryId ... NOT NULL PRIMARY KEY
, ...
);

キーワードの場合、次のようになります。

CREATE TABLE keyword
( KeywordId ... NOT NULL PRIMARY KEY
, ...
, EntryId ... REFERENCES entry (EntryId)
)

つまりIdは使用しないでください。あいまいすぎます。属性は、特に何かのIDです。また、項目EntryIdがエントリと同様に命名されていることに注意してください。

Ms-accessには制限があり(少なくとも以前はそのように使用されていました)、複合外部キーを防ぐことができるので、代理キーの問題については詳しく説明しません。

5
Lennart