0

顧客テーブルに名前、電子メール、住所、および ID によって関連付けられた応急処置である qts であるスキル テーブルが含まれているという問題があります。例えば

Customer
id = 1
Name = James
Address =  some address

Skills
1, qts
2, first aid

私は今、関係をペアリングしようとしています。私はまず、customerId だけを持つスキル テーブルを作成し、各スキルに真/偽の値を持つ簡単な解決策にたどり着きました。次に、customerId から SkillId への customer_skills 間の go を作成しました。しかし、一意のIDがないため、値が変更されたときにレコードを更新する方法がわかりません。

これを行うための最良の方法は何ですか?

ありがとう....

4

2 に答える 2

3

あなたが望む解決策は本当にあなたのデータに依存し、そして何千回も前に尋ねられた質問です。エンティティ属性値と厳密なリレーショナルモデルをグーグル で検索すると、利用可能な方法を比較対照する無数の記事が表示されます。


厳密なリレーショナルモデル

各スキルの顧客テーブルに、追加のフィールドBITまたはDATETIMEフィールド(NULL日時がスキルを持たない顧客を表す場合)を追加します。これは、時間の経過とともに大きく変化する可能性が低いスキルがほとんどない場合にうまく機能します。これにより、特にスキルのさまざまな組み合わせで、スキルを持つ顧客を簡単なクエリで見つけることができます。

SELECT  *
FROM    Customer
WHERE   Skill1 >= '20120101' -- SKILL 1 AQUIRED AFTER 1ST JAN 2012
AND     Skill2 IS NOT NULL  -- HAS SKILL 2
AND     Skill2 IS NULL      -- DOES NOT POSSESS SKILL 3

エンティティ-属性-値モデル

値はレコードの存在によって表されるブール値であるため、これは従来のエンティティ-属性-値モデルのわずかな適応です。次のようなテーブルを作成します。

CREATE TABLE CustomerSkills
(       CustomerID      INT NOT NULL,
        SkillID         INT NOT NULL
    PRIMARY KEY (CustomerID, SkillID),
    FOREIGN KEY (CustomerID) REFERENCES Customer (ID),
    FOREIGN KEY (SkillID) REFERENCES Skills (ID)
)

スキルがいつ追加されたか、誰が追加したかなどを追跡するために、DateAdded、AddidedByなどの追加の列が必要な場合がありますが、コア原則は上記から収集できます。この方法では、列を追加する必要がないため、スキルを追加するのがはるかに簡単ですが、単純なクエリをはるかに複雑にすることができます。上記のクエリは、次のように記述する必要があります。

SELECT  Customer.*
FROM    Customer
        INNER JOIN
        (   SELECT  CustomerID
            FROM    CustomerSkills
            WHERE   SkillID IN (2, 3)   -- SKILL2,SKILL3
            OR      (SkillID = 1 AND DateAdded >= '20120101')
            GROUP BY CustomerID 
            HAVING  COUNT(*) = 2
            AND     COUNT(CASE WHEN SkillID = 3 THEN 1 END) = 0
        ) skills
            ON Skills.CustomerID = Customer.ID

これは、リレーショナルモデルよりもはるかに複雑でリソースを大量に消費しますが、全体的な構造ははるかに柔軟です。


要約すると、それは実際にはあなた自身の特定の状況に依存します。考慮すべきいくつかの要因がありますが、決定に役立つリソースはたくさんあります。

于 2012-06-08T09:45:32.850 に答える
0

多対多の関係を形成するために他の 2 つのテーブルの主キーをリンクするテーブルがある場合 (例のように)、そのテーブルを更新する必要はありません。代わりに、値を削除して再挿入するだけです。

顧客 (たとえば、customerId 46) を編集してその顧客のスキルを変更する場合、顧客のすべてのスキルを削除してから、変更を保存するときに新しいスキル セットを再挿入できます。

「リンク テーブル」に 2 つの主キー列以外の追加情報が含まれている場合は、状況が異なる可能性があります。しかし、あなたの説明から、各テーブルの主キーを使用してテーブルをリンクしたいだけのようです。その場合は、削除 + 再挿入で問題ありません。

この種のテーブルでも、2 つの外部キー フィールドの組み合わせをバインド テーブルの主キーにする必要があります。

于 2012-06-08T09:02:17.583 に答える