2011-01-09 12 views
0

Pagesという名前のテーブルとCategoriesという名前のテーブルがあります。テーブルPagesの各エントリはテーブルCategoriesにリンクされています。 Categoriesテーブルには5つのエントリがあり、それらはCar,Websites,Technology,Mobile PhonesおよびInterestです。私のデータベースを設計する最良の方法を提案してください

だから、Pagesテーブルにエントリを入れるたびに、それをCategoriesテーブルにマップする必要がありますので、正しく配置されている必要があります。

ここに私のテーブルです:

ページ

id [PK] 
name 
url 

カテゴリー

id [PK] 
Categoryname 

Pages2Categories

は、
Pages.id 
Categories.id 

私の質問は、これはテーブル間のこの種の関係を作成する最も効率的な方法ですか?非常にアマチュアなようです

答えて

2

各ページのカテゴリが1つでなければならない場合は、カテゴリページIDをテーブルページに配置します。

各ページには、必要に応じて1つのカテゴリを持っており、ほとんどのページには1を持っていない、各ページにはいくつかのカテゴリーを有することができる場合は、主キー(page_idの)

と別のテーブルに(page_idの、CATEGORY_ID)を入れ、使用している場合あなたが提案したアプローチ。

この時点でのスペースやパフォーマンスは心配しないでください。

+0

ロンニス、私は主キーとして、ページのテーブルにcategoryIDを入れる必要がありますか? – Rho

+0

@Raymond、Page_idはPagesの主キーですか? [Pages.CategoryID]は[categories.ID]の外部キーである必要があります。 – Ronnis

1

¨category¨は¨page¨の属性なので、¨pages¨テーブルにその属性を保持することが最善です。スペースを節約するために、¨category¨列に整数/数値データ型を使用できます。例えば1 = Car、2 = Websites、3 = Technologyなどである。

+0

データベースの正規化について読んで、テーブルを作成するときに複数のデータエントリを避ける必要があることを示唆しています。だから私はそこにすべてのカテゴリを入れて、ただそれをリンクするカテゴリテーブルを作成しました.. – Rho

+0

@Raymond Virenの方法を使うと、数値をカテゴリタイプにマップするために別のテーブルが必要になります。それ以外の場合は、おそらくenumを使用してコード内でこれを行う必要がありますが、これはお勧めできません。上記の2つのオプションのどれがVirenが推薦しているのかはわかりませんが、Ronnisの答えはあなたのオプションをかなりよくまとめています。 –

+0

@ワールド私は、参照してください – Rho

0

1つの提案:「ページ」と「カテゴリ」の2つの表があります。ページ内の列は、次のとおりです。

名[VARCHAR] URL [VARCHAR] カテゴリー[tinyint型]カテゴリーについては

、あなたが設計どおり:

CATIDを[1 | 2 | 4 | 8 | 16] catName [varchar]

カテゴリの数が少ないと仮定します(< 8)。この数が31になる場合は、代わりに整数を使用します(1バイトあたり1つの代わりに4を使用します)。行)。今、ページテーブルのカテゴリは、他のテーブルへのFKである必要はありません。 URLが2つ以上のカテゴリに属する​​場合は、挿入/更新の論理ORを行い、jdbcコードのSELECTのANDを実行できます。最高のDBデザインではないかもしれませんが、何百万ものページを節約する必要がある場合に備えて、DBスペースを最小限に抑える必要があります。あなたの問題のステートメントから、私はあなたがテーブルにPKが必要な理由を見ません...すべての行にいくつかのバイトを節約するためにそれを排除します。よろしくね、M.S.

関連する問題