SQL / PHP: Tablo tasarım soru

4 Cevap php

İki tablo, "cart" diye bir tane ve "ürün" diye bir tane var. Şimdi cart "öğeler" ve miktarlarda bir listesini saklamak için mümkün olmak istiyorum. Yani şablon öğenin id ve miktar kimliği için bir alan var başka bir tablo "cart_items" yarattı.

Bu iyi tasarım, ya da ben "cart_item" bir kimliği için başka bir alan eklemek gerekir? Ya da hep birlikte bunu yapmak için daha iyi bir yolu var mı? Ben sepeti öğeleri doğru güncelleme yok benim sepeti güncellemek denediğimde sadece belada koşuyorum. Ne yapmak yaşıyorum all daha sonra bir sepete bağlı "cart_items" ve her "cart_item" yeniden ekleyebilir, silebilir ve ben yardım edemem ama yapmak için daha iyi bir yolu olmalı düşünüyorum olamaz bu.

4 Cevap

Bu çok iyi bir tasarım bulunuyor.

ER (varlık ilişki) açısından öğeleri ve arabaları arasında çok-çok ilişki vardır. Demek istediğimiz bir madde birçok farklı arabaları görünebilir ve bir arabası birçok farklı öğeleri içerebilir. "Pek çok" bu bağlamda "birden fazla olabilir değişken bir dizi" anlamına gelir.

Sizin cart_items tablo katılmak tablo denir ne olduğunu ve bunu çok-çok ilişkileri modellemek gerekir. Eklenen bir miktar alan da cart_items üzerine koyarak yok gibi mantıklı.

Bu tuşu geldiğinde iki seçeneğiniz var:

  1. (Cart_id, item_id) birincil anahtar yapın. Bu bileşik bir birincil anahtar denir; veya
  2. Bir otomatik artış alanı oluşturarak id çağırdı. Bu make yaparsanız (cart_id, item_id) benzersiz bir dizin benzersizliği zorlamak.

Ya seçim geçerlidir. Şahsen ben tercih (2). Ayrıca büyük olasılıkla (item_id, cart_id) benzersiz bir dizin olmalıdır.

Tablolarınızın nasıl görüneceğini emin değilim tam olarak Im, ancak aşağıdaki gibi bir şey iyi bir başlangıç ​​olacaktır.

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|

Her sepeti kendi satırında depolanan her öğe ile, benzersiz bir kimliği vardır. Bu şekilde eklemek veya bağlantılı onları tutarak, eşyaları bir kerede kaldırmak, hem de aynı anda bir sepeti tüm öğeleri seçebilirsiniz.

Ben size verecek biri işaretçisi, başka bir tabloya muhtemelen cart_Items öğeden tüm relavent bilgileri kopyalamak ve arabası bu bağlantı, bunun yerine doğrudan öğeleri arabaları bağlama vardır. Eğer zamanla sepetinize eklendi ne korumak, böylece bu yararlıdır. Bu sadece hızlı sadece tek bir oturum için ihtiyaç arabaları atmak sürece, kişinin zaman içinde bu noktada kendi sepeti içine koymak tam olarak ne bir geçmişi var edebilmek olmak istiyorum ve onların sepeti verileri değişiklik yok ne zaman birileri öğe hakkında bir şey değiştirmek veya öğe silindiğinde madde yok yaptırmaya karar verir.

What you are doing is correct as explained previously. The only thing that is missing is to use DELETE CASCADE and FOREIGN KEYS in your database.

Eğer CART bir satır silmek Bu yol aynı zamanda CART_ITEM bunu silmek gidecek.