2016-03-29 14 views
0

何度も私たちは、私は同じように同じデータベース内の他の問題を解決することができ、これとカテゴリデザインカテゴリツリーのDBデザインはどれぐらい効率的ですか?

car(id, tag, year, make_category_id, model_category_id) 
    category (id, name, description, parent_category_id) //this works like a tree 

でこれを解決しようとしている

car(id, tag, year, make_id, model_id) 
    make(id, name) 
    model(id, name, make_id) 

このシナリオを見つけた正規化する場合:

contact(id, nickname, phone_id, email_id, address_id, person_id, company_id) 
    email(id, email_value, category_id) //category represent the Type(Personal, Work) 
    phone(id, phone_value, category_id) //category represent the Type(Cell, Home, Work,..) 
    address(id, address_value, category_id)//category represent the type(Billing, Physical) 

したがって、すべてのカテゴリを同じテーブルに配置すると、ツリー内でカテゴリを無期限に作成できるようになりますが、私の質問i s:このアプローチはどれぐらい効率的ですか? おかげ

Category Table

これは、アクセスDBMのためではありませんが、私は、フォーム上のコンボボックスを埋めるためにアクセスしてSQLのクイックテストを実行します。で

SELECT c.name AS Category, category.name AS Subcategory, category.id 
    FROM category AS c INNER JOIN category ON c.id=category.parentcategory 
    WHERE c.[name]='Vehicle';//CB populated with subcategories from Vehicle parent category 

とコンボボックスモデル:私はメイクコンボボックス人口車用のフォームで

SELECT c.name AS Category, category.name AS Subcategory, category.id 
    FROM category AS c INNER JOIN category ON c.id=category.parentcategory 
    WHERE c.[name]='Email';//CB populated with subcategories from Email parent category 

:とのメールの連絡先I人口Eメールタイプコンボボックスの形で

SELECT c.name, c.id 
    FROM category AS c 
    WHERE (((c.parentcategory)=[Forms]![Car]![Combo38]));//CB populated with subcategories from Make selected parent category 
+0

あなたのデザインが特に効率的で、そして一部のデータベースでは非常に難しいことではありません。親の代わりに、カテゴリの完全パスを含めます。それははるかに効率的です。 –

+1

@ GordonLinoff:私の経験では、(このモデルに必要とされる)再帰的なクエリはかなり効率的です。完全パスを格納するのは、実際には**階層を更新する必要がある場合は非常に非効率的です**。現代のSQL(http://modern-sql.com/slides)をサポートするDBMS _not_は例外であり、今日のルールではありません –

+0

私はモデルを理解していますが、どの問題が解決しているのかはっきりしていません... ...? –

答えて

0

OTLTの亜種である「真のルックアップテーブル」なぜこれが悪いことかもしれないのかを詳細に議論するウェブ上の記事がたくさんあります。 Googleの「1つの真のルックアップテーブル」、さらにはOTLTだけでも、カップルを読んで、自分が今作業しているものに適しているかどうかを判断します。

良いスタートとして、ここではSimpleTalkサイト上のフィルファクターによる被写体の記事があります:https://www.simple-talk.com/blogs/2008/05/29/when-the-fever-is-over-and-ones-work-is-done/

+0

おそらくあなたはそうであるので、これを管理するのに十分な効率的な方法があります。私は、データ型、階層またはオブジェクトを置き換えることを試みているわけではないことを知っています。これはユニークなアイデアだとは思っていませんが、ユーザーは時々コンセプトを変更または追加したいので、カテゴリスキーマが必要です。ですから、私はこのパターンを持っています。人々が動的に管理したいと思う多くの用語や、idsやテキストだけの異なるテーブルです。カテゴリや概念としてそれを見るのは悪いですか?どのような方法でも、感謝します。 –

+0

データ属性セットごとに1つの専用システム「one size fits all」システムは短期的な問題ですが、宣言的な関係性の保全性とは別に、より大きな問題は長期的にどのように機能するかです。無数のセットから値が追加(および削除/無効化)されると、引き続き正常に機能しますか?データを使用する必要があるため、シンプルで効率的か、必要なプログラミングが新たな要件が発生したときにシステムを拡張または変更する上で障害になりますか? –

+0

コードと構造を作成することは、すべてうまくいっていますが、3つのM:管理、保守、変更を見落とさないようにしてください。 –

関連する問題