0

単一のテーブルを複数に分割する場合、外部キーが別の行の主キーを参照するのは一般的なケースですか?
たとえば、
ソーステーブルのデータは

id1  id2 name1   name2
10   1   a10     b1
9    8   a11     b2
8    3   a12     b3
3    9   a14     b4
1    10  a15     b5

したがって、主キーテーブルを次のように作成すると

  create table pk_table (id1 integer primary key , name1 varchar2(20))

および外部キーテーブルとして

  create table fk_table (id2 integer, name2 varchar2(20) foreign key(id2) references pk_table(id1))

したがって、テーブルごとにデータを分割すると:

pk_table データは次のとおりです。

id1 name1
10  a10
9   a11
8   a12
3   a14
1   a15

外部キーデータは

id2  name2
1   b1
8   b2
3   b3
9   b4
10  b5

ソース テーブルの同じ行 pk を参照する fk がないこれらのケースを見たことがありますか?

編集済み:テーブル データを更新して、より有効にしました。

4

2 に答える 2

2

まず、あなたが尋ねた質問に答えるために:

はい、1 つのテーブルを 2 つ (またはそれ以上) に分割すると、異なる行にデータが表示されます。これが、Supposed To Be™ のあり方です。元のデータがテーブルのどの行であったか、または新しいデータであるかは問題ではありません。行番号はデータとは関係ありません。それは、それ自体が表示される方法です。たとえば、次のpk_tableように新しいものを作成できます。

id1 name1
1   a15
3   a14
8   a12
9   a11
10  a10

そして、それは何の違いもありません。

第二に、これは他の人があなたに伝えようとしていることを扱っています。元のテーブルを 2 つのセカンダリ テーブルに変換した方法では、データベースは得られません。a)を作成するために指定した構文はfk_table意味がなく、b) は機能しません。

テーブルを分割するときに必要なfk_tableことは、 の主キーを含む に新しい列を作成することpk_tableです。fk_tableこの余分な列は、 のどのレコードが のどのレコードと一致するかをデータベースに伝えるリンクですpk_table。元の質問に戻ると、このリンクが、古いレコードまたは新しいレコードが存在する行に違いがない理由です。重要なのは、の外部キー列fk_tableです。

これを実際に理解するために、新しいテーブルは次のようになります。

pk_table -id1主キーです:

id1 name1
10  a10
9   a11
8   a12
3   a14
1   a15

fk_table -id2は主キーで、次fk_id1の外部キーpk_tableです:

id2  name2 fk_id1
1   b1     10
8   b2     9
3   b3     8
9   b4     3
10  b5     1

pk_tableこの構造を使用すると、各レコードを正しいfk_tableレコードに正しくリンクするクエリを実行できます。

于 2013-04-04T15:52:16.230 に答える
0

テーブルを分割する方法は、正規化基準に従っていません。ソース テーブルのフィールド間に (目に見える) 機能的な依存関係はありません。次に、テーブルは PK-FK 関係を共有していません。PK-FK でテーブルを分割するという仮定が正しくないため、質問は無意味です。

于 2013-04-04T13:57:48.763 に答える