2

これらのテーブルを 1 つのテーブルにマージする必要がありますか? トリッキーな代替手段はありますか?

Table Unit for a Template table:


Id (PK)
ParentId
Name
TemplateId (FK)

Table Unit2 for a Testplan table:

Id (PK)
ParentId
Name
TestplanId (FK)

編集:

次のような表を作成してみませんか。

[UnitId] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](50) NOT NULL,
    [TemplateId] [int] NULL,
    [TestplanId] [int] NULL,
    [ParentId] [int] NULL,

更新 2:

1 Template has N Unit
1 Template has N Testplan
1 Testplan has N Unit

これらは、1 つの Unit テーブルを使用した関係です。ただし、これは Unit テーブルの TemplateId AND TestplanId でのみ機能します。

4

6 に答える 6

4

いいえ、類似しているが関連のないテーブルはマージしないでください。

それらは外部キー列が異なります。あるテーブルを指す場合もあれば、別のテーブルを指す場合もある外部キーを作成する簡単な方法はありません。

更新では、外部キーごとに1つずつ、2つの列を追加してこの状況を処理し、両方をnull可能にしました。しかし、すべてのテンプレートにテンプレート ID が 1 つだけあることを要求したいとします。TemplateId元の設計では、列を作成することでこれを簡単に実現できますNOT NULL。ただし、テスト計画を作成できなくなるため、結合されたテーブルでそれを行うことはできません。

誰かが aTestplanIdと a の両方を持つアイテムを追加したとTemplateIdしたら、それを許可したいですか? 古い設計ではこれは不可能でしたが、組み合わせたテーブルでは可能です。

この状況は、CHECK制約を追加することで処理できますが、複雑さが増し、ほとんどまたはまったくメリットがありません。

于 2012-06-20T19:50:28.050 に答える
0

いいえ。関係のない情報が保存されているためです。
この例では、テンプレートとテストプランは完全に無関係なエンティティであるため、1つのテーブルにまとめないでください。

于 2012-06-20T19:53:47.217 に答える
0

両方のテーブルが非常に似ていて繰り返しに見える場合でも、それらをマージする必要はないと思います。それらはどのようにも接続されていませんが、別個のテーブルを維持することを意味していました。

于 2012-06-20T20:25:55.483 に答える
0

問題のコメントに続いて:

テーブルの数を減らそうとすると、意図した目的がわかりにくくなります。オブジェクトのリレーショナル データベースを設計しようとするときは、それぞれの関係について 2 つの質問を自問してください。ABですか?ABを持っていますか?

http://en.wikipedia.org/wiki/Is-a

http://en.wikipedia.org/wiki/Has-a

一連の has-a 関係があります。(具体的には has-many) テンプレートには単位があります。テンプレートにはテスト計画があります。Testplan にはユニットがあります (ただし、後でわかるように、異なるユニットです)

has-many 関係ごとに、外部キー列をプロパティ テーブルに追加します。たとえば、ユニットには template_id があります。

Template
----------
id
<other columns>

TemplateUnit
----------
id
template_id (FK)
parent_id (FK) -- references same table?
name
<other columns>

Testplan 
----------
id
template_id (FK)
<other columns>

TestplanUnit
---------
id
testplan_id (FK)
parent_id (FK)
name
<other columns>

このようなスキーマを使用すると、どのテーブルとどの列が他のどのオブジェクトに関連しているかについて混乱することはありません。これにより、クエリも非常に簡単になります。

SELECT *
FROM Template a
JOIN TemplateUnit b
    ON a.id = b.template_id
JOIN Testplan c
    ON a.id = c.template_id
JOIN TestplanUnit d
    ON c.id = d.testplan_id

これで、すべてのb列がテンプレート ユニットであり、すべてのd列がテストプラン ユニットであることがわかりました。簡単です。

于 2012-06-21T18:08:26.380 に答える
0

継承を模倣することが目標である場合は、最初に識別子列について読んでから、提案されたテーブルをそれに応じて変更することをお勧めします。

多くのエンティティが共有する共通の Unit テーブルを提供することが目標である場合は、次のような方法を試すことができます。

create table UnitList (
      Id int not null primary key
)

create table Unit (
      Id int not null primary key
    , ParentId int null
    , Name nvarchar(50) not null
    , UnitListId int not null references UnitList (Id)
)

create table Template (
      Id int not null primary key
    , UnitListId int not null references UnitList (Id)
)

create table Testplan (
      Id int not null primary key
    , UnitListId int not null references UnitList (Id)
)

その時点で、おそらく、ビジネス ルールに従って Unit テーブルにいくつかの一意の制約を設定する必要があります。Unit テーブルに重複を入れたくないが、1 つのユニットを多くのリストに含めることを許可したい場合は、UnitToList ジャンクションを作成することもできます。

于 2012-06-20T20:10:38.527 に答える
0

これら 2 つのテーブルを、次の列を持つ 1 つのテーブルに簡単に結合できます。

Id (PK)
ParentId
Name
TemplateId (FK) 
TestplanId (FK)

これは良い考えですか?まあこれは依存します。2 つのテーブルには本質的に同じエンティティが含まれていますか? この質問に答えるのが難しい場合は、クエリを満たすために 2 つのテーブルでユニオンを実行するかどうかを考えてください。

どちらにも ParentId 列があります。親は常に子と同じタイプですか? それとも、親はまったく別のものですか?混合ツリー構造の場合は、すべての ID を 1 つのテーブルに格納する必要があります。2 つの異なるツリー構造がある場合は、2 つの異なるテーブルが必要になることがあります。

同様に、TemplateId と TestplanId の両方を持つ ID がある場合は、それらを同じテーブルに配置することをお勧めします。同様に、どちらも持たない ID がある場合は、それらをすべて 1 つのテーブルに入れることをお勧めします。

元の 2 つのテーブルに外部キー制約を設定して、キーが決して NULL にならないようにすることができます。1 つのテーブルのバージョンでは、これを行うことはできません。2 つのキーのうち少なくとも 1 つ (または 1 つだけ) が NULL であることを示す制約を追加できます。

于 2012-06-20T19:58:25.040 に答える