表模式,表中的多个或bool值

时间:2012-03-19 20:29:11

标签: mysql database database-schema

如果我的数据库中有一堆餐馆,而且每个餐厅都有午餐菜单,晚餐菜单或早午餐菜单,那么在餐馆餐桌中有这样的布尔值是否有意义:

餐厅ID |餐厅名称|地址|等.. |午餐菜单|晚餐菜单|早午餐菜单

或者我应该创建一个菜单表,然后有一个RestaurantMenu表(很多很多关系)

菜单ID |菜单名称

1 |午餐菜单

2 |晚餐菜单

3 |早午餐菜单

2 个答案:

答案 0 :(得分:1)

另一个建议是使用链接表。这将更易于维护并且易于记录。当您具有多对多关系时,将使用链接器表。 (餐厅可以有多种菜单,许多餐馆都可以使用特定类型的菜单。)

这使您可以在以后的“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     

答案 1 :(得分:0)

我的建议是使用简单的位掩码类型的字段:

例如:

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

如果有必要,您可以添加更多。

如果一家餐馆既有早餐也有午餐,但没有早午餐和晚餐,那就是1 + 4,所以专栏有5个。

如果一家餐馆有上述所有,那就是1 + 2 + 4 + 8,即15。

但是,它可能不是未来db维护者最可读的。但是,这是一个简单的方法,让一列显示多个选项。

修改

这只是简单的二进制操作。它的工作原理如下:

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");