2009-07-03 4 views
0

У меня есть две таблицы, одна называется «cart» и одна называется «items». Теперь я хочу, чтобы тележка могла хранить список «предметов» и количества. Поэтому я создал другую таблицу «cart_items», в которой есть поле для идентификатора шаблона, идентификатор элемента и количество.SQL/PHP: вопрос дизайна таблицы

Это хороший дизайн, или я должен добавить другое поле для идентификатора «cart_item»? Или есть лучший способ сделать это все вместе? У меня просто проблемы, когда я пытаюсь обновить свою корзину, мои пункты корзины не обновляются правильно. То, что мне нужно сделать, это удалить все «cart_items», прикрепленные к тележке, а затем повторно добавить каждый «cart_item», и я не могу не думать, что должен быть лучший способ сделать это.

ответ

2

Это очень хороший дизайн.

В терминах отношений ER (сущность) существует взаимосвязь «многие-ко-многим» между элементами и телегами. Под этим я подразумеваю, что предмет может появляться во многих разных тележках, и тележка может содержать много разных предметов. «Многие» в этом контексте означают «переменное число, которое может быть более одного».

Ваша таблица cart_items - это так называемая таблица соединений, и вам нужно моделировать отношения «многие ко многим». Добавлено поле количества также имеет смысл, как и положить его на cart_items.

У вас есть два варианта, когда дело доходит до ключа:

  1. Марка (cart_id, ITEM_ID) первичный ключ. Это называется составным первичным ключом; или
  2. Создание поля автоматического приращения с именем id. Если вы сделаете это, сделайте (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| 

Каждая тележка имеет уникальный идентификатор, с каждый элемент хранится в отдельной строке. Таким образом вы можете добавлять или удалять элементы по одному, сохраняя при этом их привязку, а также одновременно выбирать все предметы из одной тележки.

1

Один указатель, который я вам дал бы, вместо того, чтобы напрямую привязывать тележки к элементам, чтобы вы скопировали всю релевантную информацию из этого предмета в другую таблицу, возможно, в корзину, и связали ее с тележкой. Это полезно, чтобы вы сохраняли то, что было добавлено в корзину с течением времени. Если они не просто быстро выбрасывают тележки, которые вам нужны только на один сеанс, вы хотите иметь возможность точно узнать, что именно человек вложил в свою корзину в этот момент времени, а также не изменить данные своей корзины, если кто-то решает что-то изменить об элементе или убрать элемент при удалении элемента.

1

Что вы делаете правильно, как объяснялось ранее. Единственное, чего не хватает, это использовать DELETE CASCADE и FOREIGN KEYS в вашей базе данных.

Таким образом, когда вы удалите строку в CART, она также удалит ее в CART_ITEM.

+0

Не могли бы вы объяснить, как это работает? – MackDaddy

+0

Возможно, этот учебник поможет. http: //www.sitepoint.ком/блоги/2009/03/12/MySQL-иностранные клавиши-быстрее-база-разработка / – elviejo79

Смежные вопросы