我正在考虑开发一个在线食品配送系统,同时预订一个桌子/大厅的概念。市场上只有一个竞争对手。这就是为什么我想要提供用户友好的完整功能包。我设计了一个数据库,但我想采用专家的想法,如何扩展或简化我的数据库设计。请自由分享您对最佳数据库设计的想法。
以下是我的想法:
Customer
user(FK)
first_name
last_name
phone_number
email
address
liked_restaurant(M2M)
Restaurant
user(FK)
name
city
place
phone_number
email
website
banner
view
lat
lang
speciality
opening_time
closing_time
features(M2M) # like Breakfast, Lunch, Night Life etc
status(open or closed)
is_parking
is_wifi
timings(M2M) # sunday opening&closing time, monday opening&closing time, ... etc
Category
menu_category
Menu
restaurant(FK)
category(FK)
name
price
minimum_quantity
available
rating
Order
user(FK)
order_id(PK)
food_id(M2M)
restaurant_id(FK)
quantity
total_price
BookTable
user(FK)
restaurant(FK)
quantity
type - table/cabin/hall
Review
我应该如何使用更好的设计构建数据库?我有什么错误或错过了吗?
答案 0 :(得分:1)
正如我的评论中所述,这是一个基于意见的问题,可以有许多不同的答案。此问题也不适合像stackoverflow这样的网站。
但是,让我们试着帮助你。
Customer
user(FK) # why do you need this?
如果你想延长django User
课程,这不会真正做到这一点。您在客户和用户之间需要1:1的关系。另外,在其他模型中,您应该进一步引用Customer
,而不是User
。
所以请改为:
Customer(models.Model):
user = models.OneToOneField('User', ...)
在实体Restaurant
(和所有其他实体)中引用Customer
。我想知道为什么你有用户:餐厅1:n关系。无论如何你应该改为:
Restaurant(models.Model):
customer = models.ForeignKey('Customer', ...)
如果可以,请使用PostgreSQL和JSON字段作为开放时间。那么你可以这样:
timings = JSONField()
和JSON看起来像:
{
'Monday' : {
'opens': '10am',
'closes': '10pm'
},
'Tuesday' : {
'dayoff': true
},
'Wednesday': {
'opens': '9am',
'closes': '11pm'
}
# and so on
}
你可以(并且应该)以不同的格式投入时间,但这只是一个例子。 JSON可以非常灵活,你可以省去几天,你可以每天拥有不同的属性,包括休息(餐厅营业时间为上午9点至下午2点,然后休息至下午5点,当它再次打开直到晚上10点)。因此,应删除属性opening_time
,closing_time
和timings
,即在此JSON字段中合并。
将status
设为虚拟字段。写一个获取当前时间的方法,并检查餐厅是开放还是关闭。不要将其持久存储到数据库中。
您的实体Menu
应该称为Meal
或MenuItem
。更好地考虑如何命名变量。命名非常重要,我说在编程中最重要。如果你不能正确地命名一个班级,方法或财产,你就不会真正知道它是什么。
在Order
food_id(M2M)
restaurant(FK)
和food_id(M2M)
。为什么?如果quantity
转到之前的型号,那么您可以在那里找到餐厅。除非你想要一些像“牛肉汉堡"”和“#34;鸡肉浓汤”这样的东西,并且可以由许多不同的餐馆提供服务。
为什么Order
是- 3 beers
- 1 coke
- 2 buffallo wings
- 1 spare ribs
- 1 nachos
的属性?当我想到订单时,它可能看起来像这样:
through
你的意思是哪个数量?我做了一个带有额外字段的M2M表,在Django中你可以指定OrderFood(models.Model):
order_id(FK)
food_id(FK)
quantity
表,并用所需的附加字段定义该模型:
{
'Burgers': [
'Hamburger',
'Cheesburger'
],
'Beverages': [
'Coke',
'Fanta'
]
}
我可以写得更多,但现在就是这样。我希望它对你有所帮助。 把一切都放在纸上。绘制您的实体 - 不写名称 - 制作草图。画出顾客,餐馆,餐桌,食物,并为他们分配财产,并思考他们所处的关系。
编辑:
查看JSONField的文档: https://docs.djangoproject.com/en/1.11/ref/contrib/postgres/fields/#jsonfield
我将骨架作为标准关系数据库,并将所有灵活属性放在JSON中。根据餐厅的不同,可以将菜单视为非常不同。快餐带走可以:
{
'Entrees': [
... whatever
],
'Main courses': [
{'Poultry': [ ... ]},
{'Beef': [ ... ]},
{'Fish': [ ... ]}
],
'Deserts': [
... whatever
],
'Beverages': [
{'Wines': [
{'White': [...]},
{'Red': [...]}
},
{'Aperitifs': [...]},
{'Beers': [...]}
]
}
高贵的法国餐厅可以:
import calendar
from datetime import datetime
Restaurant(models.Model):
timings = JSONField()
# illustrational code, not for production
def _get_status(self):
now = datetime.now()
weekday = calendar.day_name[now.weekday()]
if self.timings.get(weekday, False):
open = self.timings[weekday].get('opens', 0)
close = self.timings[weekday].get('closes', 0)
if now.hour() >= open && now.hour() < close:
status = 'open'
else:
status = 'closed'
else:
status = 'closed'
return status
status = property(_get_status)
status.short_description('Status open-closed')
编辑:解释虚拟模型字段
虚拟模型字段表示模型实体具有不会持久保存到数据库的属性,因此不会作为数据库表中的列存在。
示例:
status
对于$("#profile_image").attr('src', base_url+"asset/user_image/"+data[0].Userid+".jpg#"+ new Date().getTime());
,我们不会成为表格中的一列。您不会将该值保存在数据库中,因为它取决于当前时刻。因此,您可以检查餐厅现在是否开放。您可以获取当前工作日和当前小时,并将其与JSONField中的值进行比较。