2016-03-26 8 views
0

私は複数のアイテムを保存するデータベースを持っていますが、すべてのアイテムが一意になりますが、他のメーカーの選択肢を持つことができます。したがって、アイテムは相互に潜在的なM:M関係を持つことになります。データベース:アイテムには選択肢があり、データベースにリンクする方法は?

たとえば、アイテムAには3つの選択肢があります。私がアイテムBを追加すると、代替アイテムのリンクも逆になるので、アイテムBを検索すると、アイテムAが選択肢として表示されます。アイテムCを追加するときは、アイテムAとアイテムBの両方の代替アイテムとして追加する必要があります.Cは代替アイテムAとBを持っている必要があります。

どのようにして、それ自身の種類?

代替案が追加された場合は、その親ID(代替ID)にリンクされているので、新しいIDがない場合は、新しい項目ごとに一意のIDを持つ代替案の間に表を作成します。代替表で作成することができます。後でこれが代替であることが判明した場合は、2つのうちの1つの代替IDを削除し、その項目を他の代替IDに追加します。

public partial class Item : Entity 
{ 
    public Item() 
    { 
     Id = GuidComb.GenerateComb(); 
    } 
    public Guid Id { get; set; } 
    public string ItemName { get; set; } 
    public string MakerRef { get; set; } 
    public string Description { get; set; } 

    public virtual Maker Maker { get; set; } 
    public virtual IList<Offer> Offers { get; set; } 

    //stuck here on the smart way to make the relationship with itself? 
} 

アドバイスは歓迎します。 ありがとうございます!

答えて

0

私が考えている提案は、あなたが提案したものと似ているかもしれませんが、私はデータベース用語でそれを定式化しようとします。

あなたの要件を理解する限り、あなたの選択肢の関係は完全に推移的になります。これは、あなたのアイテムセットが、相互に代替可能なアイテムを含むサブセットの等価クラスに分割されていることを意味します。 (ある項目にまだ選択肢がない場合は、この項目のみで構成されます)

これが正しければ、これを表現する最もエレガントで冗長性のない方法は、サブセットなどのアイテムの1つをサブセット全体を表す。これは、次のテーブルデザインに反映されています。

item(id, equivalence_id, other attributes, ...) 

equivalence_idは、代表者の外部キーです。各項目は、等価IDがnullの場合に生成されます。これは他の項目と同等行われた場合、

  • アイテムが既に存在ヌルの等価IDを持っている場合、アイテム場合、両方の項目の等価それに

  • この代表のIDを割り当てますすでに存在していない同値idを持つ場合、これを新しいアイテムの同値idに代入します。

これが動作することに注意してください、場合に同じ等価クラスで多くの項目、新しいものをリンクするために使用されているこのアイテムのどんなにがあります。

例:

id equivalence_id name 
1 1    abc 
2      def 
3 1    ghi 
4 4    jkl 
5 4    mno 

これは、ABCを意味し、GHIは同等の、だけでなく、JKL MNOとしているが、まだ何もDEFと同等ではありません。今度はpqrがabcと等価になるべきであれば、同値id1を得るでしょう。その効果はghiと同等にすることと同じです。

は、クエリ

select * 
from item 
where equivalence_id = :my_equivalence_id 

全体としての等価クラスに属するいくつかの情報が格納される場合は、等価クラスのための別のテーブルにのみ作成する必要があり、特定のものと同等のすべての項目を検索するには。

関連する問題