Схема БД, многие-многие или значения bool в таблице - PullRequest
0 голосов
/ 20 марта 2012

Если у меня есть несколько ресторанов в моей базе данных, и у каждого ресторана может быть меню обеда, меню ужина или меню позднего завтрака, имеет ли смысл иметь логические значения в таблице Restaurants следующим образом:

идентификатор ресторана |Название ресторана |Адрес |и т.д .. |Меню обеда |Меню ужина |Позднее меню

Или я должен создать таблицу меню, а затем иметь таблицу RestaurantMenu (отношение многие-многие)

Идентификатор меню |Название меню

1 |обеденное меню

2 |меню ужина

3 |бранч меню

Ответы [ 2 ]

1 голос
/ 20 марта 2012

Другое предложение заключается в том, что вы используете таблицу компоновщиков. Это было бы более легко обслуживаемым и легко документированным. Таблица компоновщика используется, когда у вас есть отношение многие ко многим. (В ресторане может быть много типов меню, а во многих ресторанах можно использовать определенный тип меню.)

Позволяет добавить дополнительные типы меню в виде строки в таблице «menu_types» позже, не изменяя структуру любой таблицы.

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

Во-первых, у вас будет три таблицы примерно так:

restaurants
---------------
id    name
1     Moe's
2     Steak & Shrimp House
3     McDonald's

restaurant_menus
----------------
restaurant_id    menu_type
1                1
1                3
2                4
3                1
3                3
3                4

menu_types
---------------
id    type
1     Breakfast
2     Brunch
3     Lunch
4     Dinner

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

SELECT r.name, mt.type
FROM restaurants r
    JOIN restaurant_menus rm
        ON (r.id = rm.restaurant_id)
    JOIN menu_types mt
        ON (rm.menu_type = mt.id)
ORDER BY r.name ASC;

Это даст:

name                  type       
--------------------  -----------
McDonald's            Lunch      
McDonald's            Breakfast  
McDonald's            Dinner     
Moe's                 Breakfast  
Moe's                 Lunch      
Steak & Shrimp House  Dinner     
0 голосов
/ 20 марта 2012

Я предлагаю использовать простой тип поля битовой маски:

Например:

1 = breakfast
2 = brunch
4 = lunch
8 = dinner

Вы можете добавить больше, если это станет необходимым.

ЕслиВ ресторане есть и завтрак, и обед, но не поздний завтрак и не ужин, это 1 + 4, поэтому столбец получает 5.

Если в ресторане есть все вышеперечисленное, то это 1 + 2 + 4 + 8, что составляет 15.

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

Редактировать:

Это просто простые двоичные манипуляции.Это работает следующим образом:

Dinner   Lunch   Brunch   Breakfast
-------- ------- -------- ---------
0        0       0        1             1 (Breakfast only)
1        1       0        0             12 (Dinner + Lunch)
1        1       1        1             15 (All four)

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

В вашей программе вы можете определить, какие виды меню доступны с некоторыми побитовыми операторами.В C #, например:

const int BREAKFAST = 1;
const int BRUNCH = 2;
const int LUNCH = 4;
const int DINNER = 8;

int RestaurantMenuType = 5;

bool OffsersBreakfastMenu = (RestaurantMenuType & BREAKFAST) == BREAKFAST;
bool OffsersBrunchMenu = (RestaurantMenuType & BRUNCH) == BRUNCH;
bool OffsersLunchMenu = (RestaurantMenuType & LUNCH) == LUNCH;
bool OffersDinnerMenu = (RestaurantMenuType & DINNER) == DINNER;

Console.WriteLine("Offers breakfast? {0}", OffsersBreakfastMenu ? "Yes" : "No");
Console.WriteLine("Offers brunch? {0}", OffsersBrunchMenu ? "Yes" : "No");
Console.WriteLine("Offers lunch? {0}", OffsersLunchMenu ? "Yes" : "No");
Console.WriteLine("Offers dinner? {0}", OffersDinnerMenu ? "Yes" : "No");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...