2009-07-03 18 views
0

私は2つのテーブルを持っています.1つは「カート」と呼ばれ、もう1つは「アイテム」です。今、私はカートが "アイテム"と数量のリストを保存できるようにしたい。だから私は、テンプレートのID、項目のIDと数量のフィールドを持つ別のテーブル "cart_items"を作成しました。SQL/PHP:テーブル設計の質問

「cart_item」のIDに別のフィールドを追加する必要がありますか?または、これをすべて一緒に行うより良い方法がありますか?私は自分のカートを更新しようとすると困っただけで、カートのアイテムは正しく更新されません。私がしなければならないのは、すべてカートに「cart_items」を添付してから、それぞれの「カートアイテム」を再追加することです。これを行うにはもっと良い方法があるはずです。

答えて

2

これはとても良いデザインです。

ER(エンティティリレーションシップ)用語では、アイテムとカートの間に多対多の関係があります。それによって、商品は多くの異なるカートに表示され、カートにはさまざまなアイテムが含まれる可能性があります。この文脈における「多くの」は、「1つ以上の可変数」を意味する。

あなたのcart_itemsテーブルはジョインテーブルと呼ばれ、多対多リレーションシップをモデル化するために必要です。 cart_itemsに載せるのと同じように数量フィールドも追加されました。

  1. メイク(cart_id、ITEM_ID)主キーを:それはキーになると

    は、次の2つの選択肢があります。これは複合主キーと呼ばれます。または

  2. idという自動増分フィールドを作成します。これを行うと、make(cart_id、item_id)にユニークなインデックスを設定して一意性を強制します。

いずれかの選択肢が有効です。個人的に私は好きです(2)。また、(item_id、cart_id)に一意のインデックスを持つ必要があります。

1

あなたのテーブルがどのように見えるかはわかりませんが、以下のようなものは良いスタートになります。

Items 
+-- ID --+-- Description --+-- Etc --+ 
|  1| Good item here | Buy one.| 
|  2| Another item | somethin| 


Cart 
+-- Cart ID --+-- Item ID --+-- Amt --+ 
|   1|   1|  4| 
|   1|   2|  3| 

各カートは、それ自身の行に記憶された各項目に、一意のIDを有しています。こうすることで、アイテムを一度に1つずつ追加または削除したり、リンクを維持したり、同時に1つのカートからすべてのアイテムを選択することができます。

1

カートにアイテムを直接リンクする代わりに、アイテムのすべてのrelavent情報を別のテーブル(おそらくcart_Items)にコピーしてカートにリンクすることができます。これは時間の経過とともにカートに追加されたものを維持するのに便利です。これらが単なるセッションに必要なクイックスローカートでない限り、その時点でカートに入れたものの正確な履歴を持つことができ、誰かがカートのデータを変更しないようにする必要があります。アイテムに関する何かを変更するか、アイテムが削除されたときにアイテムが消えるようにするかを決定します。

1

あなたがやっていることは以前に説明した通りです。 欠けているのは、データベースにDELETE CASCADEとFOREIGN KEYSを使用することだけです。

このようにして、CARTで行を削除すると、CART_ITEMでも削除されます。

+0

これらの仕組みを教えてください。 – MackDaddy

+0

このチュートリアルが役立つかもしれません。 http://www.sitepoint。com/blogs/2009/03/12/mysql-foreign-keys-quicker-database-development / – elviejo79

関連する問題