2016-09-11 5 views
1

私は順序テーブルのカラムにそうitem1又はitem2item_idを格納する3つのテーブル ユーザテーブルテーブルにアイテムの繰り返しを保存するにはどうすればいいですか?

CREATE TABLE IF NOT EXISTS `user` (
    `user_id` int(11) NOT NULL AUTO_INCREMENT, 
    `name` varchar(25) NOT NULL, 
    PRIMARY KEY (`user_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8_unicode_ci; 

項目テーブル

CREATE TABLE IF NOT EXISTS `item` (
    `item_id` int(11) NOT NULL AUTO_INCREMENT, 
    `item` varchar(20) NOT NULL, 
    `price` int(3) DEFAULT NULL, 
    `likes` int(4) DEFAULT NULL, 
    PRIMARY KEY (`item_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8_unicode_ci; 

順序テーブル

CREATE TABLE IF NOT EXISTS `order` (
    `user_id` int(11) DEFAULT NULL, 
    `order_no` varchar(50) DEFAULT NULL, 
    `item1` varchar(5) DEFAULT NULL, 
    `item2` varchar(5) DEFAULT NULL, 
    `item3` varchar(5) DEFAULT NULL, 
    `item4` varchar(5) DEFAULT NULL, 
    `item5` varchar(5) DEFAULT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8_unicode_ci; 

を有します。私は5つだけの項目をユーザーが選択することができます与えるしかし、彼らはどのような任意のユーザーのような任意の項目の量を増やすことができますitem1の2つの量をどのように私はこれをデータベースに格納します。

と表の改善のための提案。

+1

[ジャンクションテーブル](http://stackoverflow.com/a/32620163)を参照してください。 – Drew

答えて

2

最良の方法は、別のテーブルを使用することです:

CREATE TABLE IF NOT EXISTS `orderitem` (
    `order_no` varchar(50), 
    `itemid` INT, 
    `qty` INT NOT NULL DEFAULT 1, 
    `price` NUMERIC(9,2) NOT NULL, 
    PRIMARY KEY (order_no, itemid) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8_unicode_ci; 

から5つのitem列を削除しますあなたの注文表。

ユーザーが項目を追加すると、INSERTが上記の表に追加されます。したがって、各注文の品目数に制限はありません。

多対多の関係がある場合には、この設計が必要です。 5つの列を使用するのは良い考えではありません。これは(あなたが知っているように)不便な制限を作り出します。

ユーザーが特定の広告申込情報の量を増やすことを許可する場合は、この表にqty列を追加します。以前選択した同じアイテムの数量を追加する場合は、qtyを増やしてください。

また、この表にはpriceの列が必要です。明日は価格が変わる可能性があるので、現在の注文中に商品に対して支払った価格を記録する必要があります。あなたのコメントを再


INSERT INTO orderitem (order_no, itemid, qty, price) 
VALUES (1234, 42, 3, 19.95) 
ON DUPLICATE KEY UPDATE qty = qty + VALUES(qty), price = VALUES(price); 

が、これは何をするかを理解することhttp://dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.htmlに関するドキュメントをお読みください。

+0

ありがとうございます。ユーザーが1つのアイテムを選択しても数量が5であれば、これを保存する方法を教えてください – gaurav

+0

詳細については私の回答を編集しました。 –

+0

ユーザが2つのアイテムを注文した場合は、3つのアイテムが1つありますので、他のアイテムが1つありますので、テーブルに挿入すると同じ注文番号の2つの行が作成されます。そのプロセスです – gaurav

0

非常に具体的な理由がない限り、自分のidフィールドを定義しないことをお勧めします。ほとんどのデータベースは、あなたのためにそれを追跡することができます。自分自身を定義したい場合は、おそらくユニークな制約を追加する必要があります。

私は質問を理解できないかもしれませんが、あなたのアイテムの値を変更できるように思えますか?私はあなたが使用しているものはかなりよく分からないが、ここで注文ごとの項目を無制限に許可するには、SQLですdocumentation

+0

ユーザーが3個のアイテムを注文すると仮定して、アイテム1のアイテムのitem_idに格納しますが、私はitem_idだけをストアしているので、数量ではありません – gaurav

+0

5つのアイテムから選択するか、maxで5つのアイテムを選択できますか? –

+0

彼らは最大5項目を選択することができます – gaurav

関連する問題