如果我的数据库中有一堆餐馆,而且每个餐厅都有午餐菜单,晚餐菜单或早午餐菜单,那么在餐馆餐桌中有这样的布尔值是否有意义:
餐厅ID |餐厅名称|地址|等.. |午餐菜单|晚餐菜单|早午餐菜单
或者我应该创建一个菜单表,然后有一个RestaurantMenu表(很多很多关系)
菜单ID |菜单名称
1 |午餐菜单
2 |晚餐菜单
3 |早午餐菜单
答案 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");