Как лучше создать таблицы в бд

делаю компонент нужна совет по оптимальной структуре таблиц

#1 31 июля 2013 в 15:09
Делаю компонент который считывает из xml файла информацию и складывает в базу.
имеется следующая структура xml:
  1. <yml_catalog date="2013-07-29 13:00">
  2. <shop>
  3. <name>Наименование магазина</name>
  4. <company>Компания</company>
  5. <url>Ссылка</url>
  6. <email>электронный адрес</email>
  7. <currencies>
  8. <currency id="RUR" rate="1"/>
  9. </currencies>
  10. <categories>
  11. <category id="2517" parentId="2515">Категории</category>
  12. <category id="2017" parentId="2115">Категории</category>
  13. </categories>
  14. <offers>
  15. <offer id="119195" available="false">
  16. <url>Ссылка</url>
  17. <price>Цена</price>
  18. <currencyId>RUR</currencyId>
  19. <categoryId>1465</categoryId>
  20. <picture>Адрес к картинке</picture>
  21. <store>true</store>
  22. <pickup>false</pickup>
  23. <delivery>true</delivery>
  24. <name>Наименование</name>
  25. <vendor>Производитель</vendor>
  26. <vendorCode>артикул</vendorCode>
  27. <description>
  28. Описание продукта
  29. </description>
  30. </offer>
  31. <offer id="119196" available="false">
  32. <url>Ссылка</url>
  33. <price>Цена</price>
  34. <currencyId>RUR</currencyId>
  35. <categoryId>1465</categoryId>
  36. <picture>Адрес к картинке</picture>
  37. <store>true</store>
  38. <pickup>false</pickup>
  39. <delivery>true</delivery>
  40. <name>Наименование</name>
  41. <vendor>Производитель</vendor>
  42. <vendorCode>артикул</vendorCode>
  43. <description>
  44. Описание продукта
  45. </description>
  46. </offer>
  47. </offers>
  48. </shop>
  49. </yml_catalog>
Каким образом построить структуру таблиц баз данных?
#2 31 июля 2013 в 15:24
Тут получается как минимум 3 таблицы:
1. Организация:
ид
name
company
url
email
currency
2. Категория
ид
category
parent
title
3.Товар
id
сompany_id
item_id
url
price
cur
cat
pic_url
store
pickup
store
delivery
vendor
artic
description
#3 31 июля 2013 в 15:30
Не совсем понятен вопрос. YML — это формат(на основе XML), в котором отдают данные Яндексу из готовой БД. А вам нужно наоборот. Тут уж надо исходить из того, куда эти данные потом пойдут. Возможно даже хватит и одной таблицы "Товары". Если магазин один — файл ведь один для одного магазина. У категорий только структура. Если можно вытащить названия категорий откуда то ещё и если они нужны, то возможно нужно будет ещё таблицу категорий товаров.
#4 31 июля 2013 в 16:09
то есть товары по категориям нет смысла разбивать?
я изначально думал так:
1 Компания (в принципе всегда одинаковые данные)
2 Категории (список всех категорий)
3 Категория 1
3.1 Товар в этой категории
3.2 -//-
4 Категория 2
4.1 Товар в этой категории
4.2 -//-

Категорий сейчас 21
а товаров в них 4-5 тыс шт.
#5 31 июля 2013 в 16:25


Не совсем понятен вопрос. YML — это формат(на основе XML), в котором отдают данные Яндексу из готовой БД. А вам нужно наоборот. Тут уж надо исходить из того, куда эти данные потом пойдут.

Марат
Разбил вопрос на части здесь только про базу данных.


Возможно даже хватит и одной таблицы "Товары". Если магазин один — файл ведь один для одного магазина. У категорий только структура. Если можно вытащить названия категорий откуда то ещё и если они нужны, то возможно нужно будет ещё таблицу категорий товаров.

Марат
Да магазин один, точнее витрина магазина. Категорийность сохранить по моему мнению важно, хотя бы для того чтоб сортировать товары, но я возможно не прав это мой первый разбор.
#6 31 июля 2013 в 16:54

то есть товары по категориям нет смысла разбивать?

VopisUVD
Одна таблица для товаров, не важно в каких они категориях.
Для категорий, я так понял названия категорий вы не получаете? Только id и id родительской категории. Соотвественно, как будете выводить категории? Ну, в крайнем случае можно состряпать свою таблицу соответствия названия категории и id. Названия категорий, думаю не меняют же? Плюс можно добавить сеолинки, настройки категории и.т.д. Если справитесь со всем этим, то можно подумать и о создании таблицы(одной) категорий в БД.
#7 31 июля 2013 в 18:04

я так понял названия категорий вы не получаете?

Марат
Почему, вот он
<categories>
<category id="2517" parentId="2515">Категории</category>
<category id="2017" parentId="2115">Категории</category>
</categories>
их 21 категория на настоящий момент

можно добавить сеолинки, настройки категории и.т.д.

Марат
оно в моем понимании ни к чему… Так как линки не должны индексироваться, они ведут на сайт основного магазина…
#8 31 июля 2013 в 18:38

Почему, вот он

VopisUVD
Виноват, пропустил. Тогда есть резон делать отдельно и таблицу категорий.

оно в моем понимании ни к чему… Так как линки не должны индексироваться, они ведут на сайт основного магазина...

VopisUVD
Ну, мало ли какая необходимость может возникнуть в будущем.
#9 31 июля 2013 в 19:39
В model.php вставляем добавление таким образом?
  1. // Добавляем запись в базу.
  2. public function addCategory($category, $categoryId,) {
  3.  
  4. //готовим запрос для добавления записи
  5. $sql = "INSERT INTO cms_topshop (category, categoryId,)
  6. VALUES ('{$category}', '{$categoryId}', NOW())";
  7.  
  8. //выполняем запрос
  9. $this->inDB->query($sql);
  10.  
  11. //если возникла ошибка, вернем false
  12. if ($this->inDB->error()) { return false; }
  13.  
  14. //если ошибок не было, вернем ID новой записи
  15. return $this->inDB->get_last_id('cms_shop');
  16. }
  17. // Добавляем запись в базу.
  18. public function addOffer($offer, $name, $description, $url, $price, $picture, $categoryId, $currencyId, $vendor, $vendorCode, $store, $pickup, $delivery,) {
  19.  
  20. //готовим запрос для добавления записи
  21. $sql = "INSERT INTO cms_topshop (offer, name, description, url, price, picture, categoryId, currencyId, vendor, vendorCode, store, pickup, delivery,)
  22. VALUES ('{$offer}', '{$name}', '{$description}', '{$url}', '{$price}', '{$picture}', '{$categoryId}', '{$currencyId}', '{$vendor}', '{$vendorCode}', '{$store}', '{$pickup}', '{$delivery}', NOW())";
  23.  
  24. //выполняем запрос
  25. $this->inDB->query($sql);
  26.  
  27. //если возникла ошибка, вернем false
  28. if ($this->inDB->error()) { return false; }
  29.  
  30. //если ошибок не было, вернем ID новой записи
  31. return $this->inDB->get_last_id('cms_shop');
  32. }
Предварительно еще нужно создать таблицы в базе?

Выдает ошибку Parse error: syntax error, unexpected ')', expecting '&' or T_VARIABLE
#10 31 июля 2013 в 20:59
Создание таблицы категории
  1. CREATE TABLE `cms_topshop_category` (
  2. `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
  3. `category` VARCHAR( 300 ) NOT NULL ,
  4. `categoryId` INT NOT NULL ,
  5. `parentId` INT NOT NULL ,
  6. INDEX ( `categoryId` )
  7. ) ENGINE = MYISAM ;
#11 31 июля 2013 в 21:08

`category` VARCHAR( 300 ) NOT NULL ,

VopisUVD
вар чар максимум может быть 255
#12 31 июля 2013 в 21:12

$sql = "INSERT INTO cms_topshop (category, categoryId,)
VALUES ('{$category}', '{$categoryId}', NOW())";

VopisUVD
Вот тут выдаст ошибку 3 колонка NOW() — используется для даты и времени. и лишняя запитая

запрос должен быть так:
  1. $sql = "INSERT INTO cms_topshop (category, categoryId)
  2. VALUES ('{$category}', '{$categoryId}'";
или так:
  1. $sql = "INSERT INTO cms_topshop (category, categoryId, date_pub)
  2. VALUES ('{$category}', '{$categoryId}', NOW())";
в это случае в таблице должна быть колонка date_pub
#13 31 июля 2013 в 21:30

VALUES ('{$category}', '{$categoryId}'";

Димитриус
Должно быть без закрывающей скобки? Или все таки так:
VALUES ('{$category}', '{$categoryId}')";
Да про дату не знал почистил

вар чар максимум может быть 255

Димитриус
Возможно я использую не правильный параметр… Какой больше подойдет для наименования категории?
#14 31 июля 2013 в 21:38
Это я уже проморгал) конечно должно быть)
#15 31 июля 2013 в 21:42


Это я уже проморгал) конечно должно быть)

Димитриус
К сожалению все равно ошибку выдает… что и раньше, пробую дальше копать)))

PS: Все сам пропустил лишнюю зпт
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.