2

Здравствуйте! Вопрос по организации БД. Думаю, что такое распределение таблиц не совсем правильно с практической точки зрения. Но с логической оно меня утраивает. Проект учебный. Скажите, как правильнее - перенести все поля из дополнительных таблиц в "Товар" или так и оставить?

Скриншот таблиц:

alt text

Grundy
  • 81,538
  • Непонятен смысл связей Товар-Рейтинг и Товар-Склад. eg: если склад только один, то разница, в какой сущности описывается доступное кол-во - чисто стилистическая. – karmadro4 Apr 18 '12 at 15:17
  • @karmadro4, а почему один склад ?

    Из рисунка я понял, что товар м.б. на разных складах, также как м.б. несколько фото этого товара и несколько рейтингов. Возможно вместо "рейтинг" надо понимать "отзыв".

    А вот категория у каждого товара одна. Такая вот "картина мира".

    @Metalex, для нее оставьте как есть.

    – avp Apr 18 '12 at 15:29
  • @avp, связь Товар-Товар_фото правильная. А непонятные связи (см. выше) - один-к-одному, т.е. дополнительные атрибуты сущности Товар. Множество складов вам показалось ;-) – karmadro4 Apr 18 '12 at 15:38
  • Наверное мне зрение отказывает. "Стрелочки" товар-фото, товар-склад и товар-рейтинг я вижу одинаковыми. – avp Apr 18 '12 at 15:57
  • 1
    @avp, не отказывает, но вы за стрелочками не видите того, что изображено на диаграмме. Подумайте, какие атрибуты соединяют те маленькие смешные черточки. – karmadro4 Apr 18 '12 at 17:26
  • @karmadro4, Вы еще и текст атрибутов читаете !

    Тогда предлагаю таблицы Склад и Рейтинг убрать, атрибуты перенести в Товар.

    Зачем лишние таблицы ?

    – avp Apr 18 '12 at 21:36
  • 1
    @avp, да, в текущем виде они не несут никакой функциональной нагрузки, и если сделать их атрибутами Товара, то станет проще работать с подобной таблицей. Или можно сделать UPDATABLE VIEW, например. – karmadro4 Apr 18 '12 at 23:00

3 Answers3

2

Есть мелкие ошибки:

  1. Для разных товаров может быть одна фотка
  2. Поле "доступен" - в таблице товар можно вычислить (если количество товара на складе больше нуля)
  3. Для размеров я б выделил отдельную сущность. т.к. многие книги идут одного формата (напр. серия книжек), тип обложки тоже можно отдельно вынести (слепить эти 2 группы свойств в одну таблицу или в 2 разных - это уже ваше дело)
  4. Вы забыли, что у каждой книги есть издатель и год издания, по которому и стоит определять, новинка данная книга или нет. Если предположить, что книга считается новинкой 1 год, то новинками будут все книги, у которых год издания больше предыдущего года.
  5. Думаю, для некоторых книг будет сложно однозначно определить категорию, почему не может быть фентезийная книга в то же время драмой или еще чем-то там (по аналогии с фильмами). В таком случае нужна связь многие к многим.
  6. Скидка - это тоже интересная штука, - она не может действовать вечно. У нее должно быть время начала и время окончания действия. Посему нужна отдельная сущность.

В итоге у нас получится:

/* - описание продукта - */
product
--------------- 
id  
name    
description 
format_id   (format.id)
publisher_id    (publisher.id)
publish_date    /* int, фактически только год и нужен */
count       /* склад один значит нет смысла выделять в отдельную таблицу */

/* - описание категории - p.s. если надо добавить ограничение по возрасту, то легче всего это сделать добавив поле в эту таблицу напр.: задав для категории "эротика" ограничение. чтоб камасутру не продавали детям школьного возраста */ category


id, name, description

/* - привязка книг к категориям - позволяет одновременно задать разные категории для книг, напр: приключения + роман или детектив, драма */ product_categories


product_id (product.id) category_id (category.id)

/* - скидки - */ discount


id startdate enddate discount

/* - привязка товаров к скидкам - в принцыпе можно было в таблицу discount добавить поле product_id, но в этом случае субд было бы неудобно пользоватся,

  • для каждого товара вам придется вбивать скидку что думаю будет неудобно.

пример: вам надо сделать скидку на все книги которые вышли 10 лет назад */ product_discounts


product_id (product.id) discount_id (discount.id)

format

id dimension /* размеры / format / тип обложки */

update: Простите, забыл добавить рейтинг, думаю, его реализация зависит от того, что вы подразумеваете под рейтингом, если значение как покупатели оценивают книгу, тогда надо сделать так, как у вас, если это "продаваемость книги", другими словами колчество продаж за единицу времени, то лучше считать находу: количество продаж / (дата последней продажи - дата первой продажи)

angry
  • 8,677
  • 18
  • 74
  • 182
jmu
  • 6,252
  • фотки не добавлял, т.к. связть многие к многим коих полным полно в приведеной мной структуре субд. думаю есть смысл хранить несколько фоток, особенно если книга это колекционное издание или это подарочный вариант - в какой-то хитрой обложке, напр: позолоченной. – jmu Apr 19 '12 at 15:58
  • По-моему, вы слегка зациклились на книготорговле (Ульмана недавно перечитывали? :), в оригинале был абстрактный товар без фиксации на книжной специфике. – karmadro4 Apr 19 '12 at 16:24
  • Отличные замечания! Но не для учебного проекта, я думаю :) – angry Apr 19 '12 at 22:01
  • 2 @karmadro4: нет, не перечитывал, даж не знаю кто это такой. а на счет книжек, тут я сам не понял как это произошло. видимо пока думал над структурой бд в поле зрения упало слово книжка, вот и понесло... хотя в принцыпе не все так печально, publishers (таблицу и поля ) надо заменить на seller/dealer, а также переименовать таблицу format в product_dimensions, выбросить из нее поле format. пример править уже не буду, - на книжках более наглядно чем на "абстрактном товаре"

    2 @Angry Bird: для учебного проэкта много связей M-M еще как подходит, - бд сразу начинает казатся большой-пребольшой 8)

    – jmu Apr 20 '12 at 08:03
1

Прочтите что такое нормализация данных. Есть замечательная статья посвященная этой большой и очень полезной науке. Фтыкать сюда. Если совсем коротко, то нужно найти правильный баланс между избыточностью данных и сложностью структуры.

Про теорему Бойса-Кодда уж умолчу.

Barmaley
  • 81,300
-1

Согласен с уважаемым @AVP, что складов может быть много и склады эти - не "квалифицированы". В таком случае необходима развязывающая отношение "многое ко многому" таблица Склад - Товар. Неверно, с моей точки зрения, отношение в таблицах Товар - Фототовар: должно быть "один к одному", раз уж так приспичило создавать Фототовар (из схемы такой необходимости не усматриваю). Рейтинг должен быть полем в Товарах, а не отдельной таблицей. Фух, я все сказал. Впрочем, если это не Рейтинг, а Отзывы, то правильно, но, в таком случае, Varchar2(45) - маловато будет.

BuilderC
  • 2,850
  • Минуснул, необходимость множества складов в данном случае спорна, а предложение по фотографиям противоречит условию. – karmadro4 Apr 18 '12 at 17:36
  • "Спорна", - так спорьте, а Вы минусуете под аккомпанемент собственных спорных утверждений. Если Склад - единственный, то зачем, вообще, его упоминать? – BuilderC Apr 18 '12 at 21:38
  • 1
    @BuilderC, мы этим и занимались выше, сейчас вроде пришли к единому мнению. – karmadro4 Apr 18 '12 at 23:10