0

Я планирую иметь несколько столов, и я не совсем уверен, как идти о проектировании «всего». Некоторая помощь будет оценена очень много! :)DB Design advice

Я в основном хочу имитировать супермаркет с рецептами и ингредиентами. Так я думал о:

  • супермаркет (имя)
  • Производитель (имя) < - Имеет много продуктов
  • Products (количество, единица, имя) < - Принадлежит производитель
  • Сумма (имя) < - стержень с количеством продуктов
  • Единица (имя) < - стержень с блоком продуктов
  • Ингредиент (название, продукт) < - шарнир с продуктами

Я как бы потерян, и я мог бы представить несколько решений, чтобы решить эту проблему. Из нескольких сводных таблиц с добавочными сводными таблицами на них в реальные простые решения, которые, вероятно, будут включать достойную часть дублирования по столам.

Я особенно интересует Ваше мнение о создании одной «большой» сводной таблицы вместо нескольких маленьких:
- «большая» таблица будет выглядеть примерно так: «ID» «ingredient_id» " product_id "" unit_id "... поэтому в основном объединяет все сводные данные на одной большой таблице.
- вместо этого «маленькие» таблицы выглядели бы как «product_unit», «component_product». Этот вопрос меня смущает.
Я как бы считаю, что один большой стол был бы лучше, но у меня нет реальной идеи быть честным.

Я использую Laravel, и я довольно новичок в кодировании. Если есть какой-то инструмент или что-то, что облегчит ваш совет, сообщите мне, и я попробую!

Большое спасибо!

ответ

1

У меня возникло много проблем с первым изучением этого вопроса с помощью Laravel. Самое замечательное в этой проблеме - вы можете использовать миграции, чтобы что-то попробовать, и отбросить их, если это не лучший способ.

Eloquent основан на [активной схеме записи] [1], поэтому чтение активных руководств по записи будет большой помощью. Вы нацелены на [нормализацию базы данных] [2]. Мне повезло с поиском «рельсов нормализации базы данных», поскольку RoR существует уже давно и использует те же шаблоны.

Мне будет легче продолжать делать то, что вы делали изначально.

> Супермаркет имеет многоэлектронные> Производители

Производитель-> принадлежат МНОГИХ> супермаркеты

продукт-> принадлежит одно-> производитель

Производитель-> имеет многоэлектронные> продукты

Если у продукта всегда есть количество, а продукт не имеет много сумм, его обычно лучше просто положить на стол продукта. Обычно продукт должен иметь опцию_amt, retail_amt на столе.

Если у вас есть что-то вроде единицы суммы:

unit_amount table: 
id | title 
1 pallet 
2 case 
3 box 
4 single 

... чем можно было бы положить, что в отдельной таблице. Причина в том, что вы можете легко исправить орфографическую ошибку, добавить другую сумму только в одном месте. Если ваш разработчик опечатывает паллеты в обновленном sql, вы не получаете дубликатов записей с ошибками в таблице продуктов.

таблица продукт будет иметь unit_amount столбец, в котором хранится идентификатор так:

product table: 
id | title | unit_amount 
1 | water | 2 

Вам нужно только сводную таблицу для многих многих отношениях. Сводная таблица позволит вам делать запросы, как это:

select * from manufacturer_product where manufacturer_id = 2 

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

manufacturer_product table: 
manufacturer_id | product_id 
    2   | 1 
    2   | 8 
    2   | 12 

Эта система отчасти разваливается, если у вас есть warehouse_id на этом столе тоже и производитель имеет 900 продуктов, но 2 склада:

manufacturer_id | product_id | warehouse_id 
    2   | 1  | 1 
    2   | 8  | 
    2   | 12  | 

Если у вас есть куча других столбцов вы 1 .) возвращая кучу данных, которые вам не нужны 2.) больше не могут использовать красноречие отношения и 3.) что вы собираетесь назвать таблицей?

Дэйл Rees имеет удивительный путеводитель по красноречивым отношениям здесь, что было очень полезно для меня:

http://daylerees.com/codebright/eloquent-relationships

Я в принципе хочу, чтобы загрузить «ингредиенты», которые связаны с «продуктами», которые связаны к 'изготовителям

Для этого вам необходимо использовать отношения «имеет много сквозных».Это будет выглядеть следующим образом:

class Manufacturer extends eloquent { 

    public function products { 
     return $this->hasMany('Product'); 
    } 

    public function ingredients { 
     return $this->hasManyThrough('Ingredient', 'Product'); //has many ingredients through products 
    } 

} 

Вы можете запросить отношения вроде этого:

$manufacturer = new Manufacturer; 
$ingredients = $manufacturer->ingredients(); 

Обратное тоже работает:

class Ingredient extends eloquent { 

    public function products { 
     return $this->belongsToMany('Product'); 
    } 

    public function manufacturer { 
     //this is actually belongToThrough but they don't call it that 
     return $this->hasManyThrough('Manufacturer', 'Product'); 
    } 

} 

http://laravel.com/docs/4.2/eloquent#relationships

Обратное становится немного более запутанным, см. обсуждение здесь:

https://github.com/laravel/framework/issues/6161

[1] http://en.wikipedia.org/wiki/Active_record_pattern [2] http://en.wikipedia.org/wiki/Database_normalization

+0

Спасибо большое! Это было очень полезно! Я постараюсь реализовать его и посмотреть, как далеко я смогу получить :) Было бы неплохо, если бы вы могли время от времени добывать добычу. Я пытаюсь реализовать его сейчас, но у меня все еще есть некоторые приличные большие вопросительные знаки в голове – ptrckolous