数据库设计的在线食品配送系统与书表

时间:2017-05-19 06:17:15

标签: python django database database-design django-models

我正在考虑开发一个在线食品配送系统,同时预订一个桌子/大厅的概念。市场上只有一个竞争对手。这就是为什么我想要提供用户友好的完整功能包。我设计了一个数据库,但我想采用专家的想法,如何扩展或简化我的数据库设计。请自由分享您对最佳数据库设计的想法。

以下是我的想法:

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

我应该如何使用更好的设计构建数据库?我有什么错误或错过了吗?

1 个答案:

答案 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_timeclosing_timetimings,即在此JSON字段中合并。

status设为虚拟字段。写一个获取当前时间的方法,并检查餐厅是开放还是关闭。不要将其持久存储到数据库中。

您的实体Menu应该称为MealMenuItem。更好地考虑如何命名变量。命名非常重要,我说在编程中最重要。如果你不能正确地命名一个班级,方法或财产,你就不会真正知道它是什么。

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中的值进行比较。