質問: 前回の質問を参考にさせて頂きデータベースの正規化やどのデータベースを使用するべきかがわからない>都道府県、市町村、複数人入力、 大変親切で分かりやすい回答を頂き、 属性が多い場合はタグにするといいかもしれないというアドバイスもあったのですが、 下記のような設定の場合は、同じ属性内で複数を選択する場合もあると考え、下記のようにしてみましたが、やはり理解できていないと思われるため、 再度質問させて頂きました。 例えば、衣類のように、属性が多いものをデータベースで正規化したら、と具体的に考えようとしてみたのですが、これでいいのかがわかりません。もし、アドバイスを頂けたら幸いです。 このデータベースでは、 属性が被っているものを見る時に使いたいと考えます。 例えば * リスト商品(服)名前の商品はシャツが多く、メーカーはどこで作られている * 赤いシャツはチェックが多く、日常着が多い などのつながりを正規化で表現出来ないかと思います。 [商品テーブル] * 商品(服)名前 * 商品ID プライマリーキー [商品属性テーブル] * 季節、月 * 用途(日常着、礼装)複数 * 模様 * 部品(レース、金属など)複数 * 色 複数 * 製法 * 生地の素材(木綿、絹)複数 * 生地が分厚い、薄い * 人気がある、ない [メーカーテーブル] * 商品メーカー * 商品メーカー所在地(都道府県ID、市町村ID) [都道府県テーブル] * 都道府県名 * 都道府県ID [市区町村テーブル] * 市区町村名 * 市区町村ID [売上げテーブル] * 価格 * 1年間の売上げ個数 [商品テーブル] | item_id(PK) | item_name | | --- | --- | | 1 | シャツ | | 2 | パンツ | | 3 | ジャケット | | item_id(PK) | month | | --- | --- | | 1 | 1月 | | 2 | 2月 | | -- | --月 | | 12 | 12月 | 属性:用途 | item_id(PK) | 用途 | | --- | --- | | 1 | 日常着 | | 2 | 礼装 | | 3 | 運動着 | 属性:模様 | item_id(PK) | 模様 | | --- | --- | | 1 | 無地 | | 2 | チェック | | 3 | ドット | 属性:部品 | item_id(PK) | 部品 | | --- | --- | | 1 | レース | | 2 | スパンコール | 属性:色 | item_id(PK) | 色 | | --- | --- | | 1 | 赤 | | 2 | 青 | 属性:製法 | item_id(PK) | 製法 | | --- | --- | | 1 | 手縫い | | 2 | ミシン | | 3 | 機械 | 属性:生地の素材 | item_id(PK) | 生地の素材 | | --- | --- | | 1 | 絹 | | 2 | 木綿 | 属性:生地の厚みテーブル | item_id(PK) | 生地の厚み | | --- | --- | | 1 | 厚い | | 2 | 薄い | 属性:人気テーブル | item_id(PK) | 人気 | | --- | --- | | 1 | ある | | 2 | ない | *下記は前回の回答で頂いたアドバイスをそのまま使わせて頂いています。 都道府県テーブル | pref_id(PK) | 都道府県名 | | --- | --- | | 1 | 北海道 | | 2 | 青森県 | 市区町村テーブル | city_id(PK) | pref_id(FK) | 市区町村名 | 緯度 | 経度 | | --- | --- | --- | --- | --- | | 011002 | 1 | 札幌市 | 43.06 | 141.35 | | 022039 | 2 | 八戸市 | 40.52 | 141.50 |
回答: 前の質問でのmiyahanさんの回答のポイントは商品属性テーブルです。 商品の基本的な情報(商品名や価格)だけを商品テーブルのカラムに持たせ、商品属性テーブルで複数の属性を定義しています。 今回は具体的な属性をテーブルで定義したのですから、商品属性テーブルはそれらと商品テーブルを結び付ける関係テーブルとします。 miyahanさんはitem_idとタグの2カラムでPKとしていますが、複数属性に対応するためにPKは1カラムで定義し直します。 商品属性テーブル > > id int autoincrement primary key > > item_id int //=商品テーブル.item_id > > attribute varchar(128) //対象属性 > > value int //属性id > > > たとえばこんなシャツ(item_id=1)があるとしたら、 * 北海道 * 札幌市 * 礼装、運動着 * チェック * スパンコール * 青 商品属性テーブル(関係テーブル)はこうなります。 | id | item_id | attribute | value | | --- | --- | --- | --- | | 1 | 1 | 都道府県 | 1 | | 2 | 1 | 市区町村 | 011002 | | 3 | 1 | 用途 | 2 | | 4 | 1 | 用途 | 3 | | 5 | 1 | 模様 | 2 | | 6 | 1 | 部品 | 2 | | 7 | 1 | 色 | 2 | この商品属性テーブルをselectすれば、都道府県、市町村、属性で検索できます。 属性が多くなった場合、関係テーブルを作ってやることでデータが扱いやすくなります。