2013-05-25 3 views
3

Я пытаюсь создать базу данных (используя PHP и MYSQL с XAMPP), где хранятся сведения о различных ресторанах быстрого питания и их филиалах, а также меню, предлагаемое в их филиалах. Я создал несколько таблиц в моей базе данных, в которых подробно изложены сведения о ресторанах быстрого питания, их филиалах, категории и подкатегориях их меню И элементы, которые они обслуживают в таблицах. Таблицы/примеры таблиц показаны ниже.Как связать несколько таблиц с одним ID

Restaurants 
+-------------+----------------+ 
| RestaurantID| RestaurantName | 
+-------------+----------------+ 
|  1  | PizzaHut  | 
|  2  | BurgerKing  | 
|  3  | KFC   | 
|  4  | SubWay   | 
+-------------+----------------+ 

Branches 
+---------------+----------------+ 
| RestaurantName| BranchAddress | 
+---------------+----------------+ 
| KFC   | XXX-1234  | 
| KFC   | AAA-1234  | 
| KFC   | YYY-1234  | 
| BurgerKing | DDD-1234  | 
+---------------+----------------+ 

Categories 
+---------------+----------------+ 
| BranchAddress | Categories  | 
+---------------+----------------+ 
| XXX-1234 | Fries   | 
| AAA-1234 | Burgers  | 
| YYY-1234 | Drinks   | 
| DDD-1234 | Burgers  | 
+---------------+----------------+ 

SubCategories 
+---------------+----------------+ 
| Categories | SubCategories | 
+---------------+----------------+ 
| Fries  | Cheese   | 
| Burgers  | Chicken  | 
| Drinks  | Carbonated  | 
| Burgers  | Beef   | 
+---------------+----------------+ 

Items 
+---------------+----------------+ 
| SubCategories | Items   | 
+---------------+----------------+ 
| Cheese  | CheeseFries | 
| Chicken  | Zinger   | 
| Carbonated | Pepsi   | 
| Beef  | Whopper  | 
+---------------+----------------+ 

Как можно видеть выше, каждый ресторан может иметь несколько ветвей, каждая из ветвей может иметь несколько категорий, каждая из категорий может иметь несколько подкатегорий, которые затем могут иметь несколько items.Branches могут иметь одинаковые категории и/или подкатегорий, но внутри них есть разные элементы.

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

Categories 
+----------------+ 
| Categories | 
+----------------+ 
| Drinks  | 
| Burgers  | 
| Fries   | 
| SetMeals  | 
+----------------+ 

SubCategories 
+----------------+----------------+ 
| Category  | SubCategories | 
+---------------+-----------------+ 
| Drinks   | Carbonated  | 
| Drinks   | Carbonated  | 
| Drinks   | Carbonated  | 
| Drinks   | Non-Carbonated | 
| Burgers  | Beef   | 
| Burgers  | Beef   | 
| Burgers  | Chicken  | 
+----------------+----------------+ 

SubCategories 
+----------------+----------------+-------------+ 
| Category  | SubCategories | Items  | 
+---------------+-----------------+-------------+ 
| Drinks   | Carbonated  | Pepsi  | 
| Drinks   | Carbonated  | Root Beer | 
| Drinks   | Carbonated  | Cola   | 
| Drinks   | Non-Carbonated | Orange Juice | 
| Burgers  | Beef   | Whopper  | 
| Burgers  | Beef   | Cheese Burger| 
| Burgers  | Chicken  | McChicken | 
+----------------+----------------+--------------+ 

Конечно, я мог ошибаться, и централизованные таблицы могут работать в этом сценарии. Если да, могу ли я иметь некоторые примеры и/или указания о том, как продолжить/или начать настройку таблиц?

Я думал следующее решение:

Restaurants 
+-------------+----------------+ 
| RestaurantID| RestaurantName | 
+-------------+----------------+ 
|  1  | PizzaHut  | 
|  2  | BurgerKing  | 
|  3  | KFC   | 
|  4  | SubWay   | 
+-------------+----------------+ 

Branches 
+---------------+----------------+ 
| RestaurantName| BranchAddress | 
+---------------+----------------+ 
| KFC   | XXX-1234  | 
| KFC   | AAA-1234  | 
| KFC   | YYY-1234  | 
| BurgerKing | DDD-1234  | 
+-------------+------------------+ 

Categories 
+----------------+----------------+----------------+ 
| RestaurantName | BranchAddress | Category  | 
+----------------+-----------------+----------------+ 
| KFC   |  XXX-1234 | Fries   | 
| KFC   |  AAA-1234 | Burgers  | 
| KFC   |  YYY-1234 | Drinks   | 
| BurgerKing |  DDD-1234 | Burgers  | 
+----------------+----------------------------------+ 

SubCategories 
+----------------+----------------+----------------+----------------+ 
| RestaurantName | BranchAddress | Category  | SubCategories | 
+----------------+-----------------+---------------+----------------+ 
| KFC   |  XXX-1234 | Fries   | Cheese   | 
| KFC   |  AAA-1234 | Burgers  | Chicken  | 
| KFC   |  YYY-1234 | Drinks   | Carbonated  | 
| BurgerKing |  DDD-1234 | Burgers  | Beef   | 
+----------------+---------------------------------+----------------+ 

Items 
+----------------+----------------+----------------+----------------+-------------+ 
| RestaurantName | BranchAddress | Category  | SubCategories | Items  | 
+----------------+-----------------+---------------+----------------+-------------+ 
| KFC   |  XXX-1234 | Fries   | Cheese   |CheeseFries | 
| KFC   |  AAA-1234 | Burgers  | Chicken  |Zinger  | 
| KFC   |  YYY-1234 | Drinks   | Carbonated  |Pepsi  | 
| BurgerKing |  DDD-1234 | Burgers  | Beef   |Whopper  | 
+----------------+---------------------------------+----------------+-------------+ 

Хотя таблицы выше дает каждый ресторан и его филиалы их отдельные категории, подкатегории, товары, он побеждает всю цель расколоть их в первую очередь, и довольно глупо.

EDIT: Я пытался denormalise вышеуказанных таблиц так, чтобы я мог запросить его с помощью

$query="SELECT * FROM Items WHERE Restaurantname='BurgerKing' AND 
BranchAddress='XXX-1234' AND Category='Fries'; 
$result=mysqli_query($cxn,$query) or die("Error"); 
while($row=mysqli_fetch_assoc) 
{ 
extract($row); 
echo "$Item"; 
} 

ПРИМЕЧАНИЯ: Я планирую расширить базу данных, чтобы следующими удобства ресторанов быстрого питания и даже не-F & связанные B магазинов в будущем, так что различные таблицы (Категория/подкатегориях и товары) должны иметь возможность включать категории из неживого F & связанных B магазинов (например, электроника/Книгу и т.д.)

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

Спасибо!

+0

Почему вы денормировали его как таковое. почему у вас есть подкатегории по адресу филиала. кто знает, может быть, это законно. что вы имеете в виду, это побеждает всю цель и глупо? – Drew

+0

@ Drew Pierce Я отредактировал свой вопрос, чтобы показать, почему я денормализовал его как таковой. Я просто думаю, что это глупо, потому что вместо того, чтобы денормализировать его как таковое, я мог бы также объединить все в одну огромную таблицу, а затем использовать ее как таблицу Excel , используя такие запросы, как фильтры. Например (SELECT * FROM Item WHERE RestaurantName = 'KFC';) Без необходимости использовать JOINS в моих запросах, хотя выполнение этого как бы приведет к поражению всей цели реляционной базы данных. @ yvytty –

ответ

0

Не знаете, почему вы денормализуете. Вы можете использовать столбцы, относящиеся к веткам, из категорий и подкатегорий, название категории из подкатегорий и т. Д. Оставаясь в них, вы дублируете много данных, и это не так, как вы работаете с реляционными базами данных, традиционно! Вы должны также связывать эти таблицы по идентификатору, а не по имени, как сравнение, когда соединение происходит быстрее.

Вы можете рассмотреть возможность связывания элементов с ветками с таблицей ссылок «многие-ко-многим». Таким образом, вы можете выполнить свои требования, чтобы иметь возможность связывать конкретные предметы категории/подкатегории с филиалом, не связывая всю категорию/подкатегорию.

CREATE TABLE item_link (
    id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    branch_id INT(11) NOT NULL, 
    item_id INT(11) NOT NULL, 
    KEY composite (`branch_id`, `item_id`) 
); 

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

+0

Я денормализовал таблицу так, чтобы я мог использовать запросы, не используя JOINS. Что делает ключевое слово KEY в вашей скрипке? я попытался использовать его в Google, но все, что у меня было, это составные первичные ключи, что не имеет смысла, поскольку вы уже установили первичный ключ перед использованием ключевого слова KEY. (Я имею в виду таблицу item_link, а также другие таблицы, например (цепи)). –

+0

Денормализацию следует использовать только в редких случаях, как правило, когда столы огромны (миллиарды записей), а индексы не могут получить вас по производительности. См. [Эту статью] (http://www.codinghorror.com/blog/2008/07/maybe-normalizing-isnt-normal.html) Джеффа Этвуда для получения дополнительной информации. Ключевой ключ добавляет индекс. Если вы посмотрите на план выполнения запроса в скрипте, вы увидите, что составной ключ используется для извлечения записей при присоединении item_link. –

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