V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
nimdanoob
V2EX  ›  数据库

python web 如何设计 酒店的 房态属性?

  •  
  •   nimdanoob · 2016-07-06 10:49:10 +08:00 · 1634 次点击
    这是一个创建于 3086 天前的主题,其中的信息可能已经有所发展或是发生改变。
    在用 Django 开发一个 酒店预订系统, 酒店每个房间都需要能够查询 1 个月内的房态,这个 state 字段要如何设计,如果只考虑有房没房,那么我用一个 32 位整数能够表示 1 个月内的房态。
    如果用 32 位整数,这个字段的数据每天都需要变化,因为时间过了一天,第一个字段的信息就是过时了 ,需要对字段做位移操作。 这个应该用定时任务来做,还是 在当天第一次访问数据库时,判断这个字段的数据当天有没有跟新过,再做操作
    17 条回复    2016-07-07 17:40:01 +08:00
    annielong
        1
    annielong  
       2016-07-06 10:59:53 +08:00
    看不明白,一般状态是 有客房,脏房 净房 锁房 维修房等,具体状态变化都是由具体操作来更改的,
    nimdanoob
        2
    nimdanoob  
    OP
       2016-07-06 11:05:12 +08:00
    @annielong 因为,我们的应用是做一个代理,只需要知道 是否能够入住,其实 针对的不是某个房间,而是 某个类型的房间,比如商务大床房
    menc
        3
    menc  
       2016-07-06 11:28:55 +08:00
    定时操作,数据库存的是数据,应当是正确的。
    felixzhu
        4
    felixzhu  
       2016-07-06 12:23:48 +08:00
    不太理解为什么要用位来存储,这样拓展起来和维护性都很差吧,毕竟往后很可能不止两个状态
    我是觉得还是每天单独存一个字段比较好,分库分表什么的也好做

    然后我的理解更新肯定是有人预定的时候就要去更新吧,毕竟有人预定了之后应该就不能再继续预定了所以不能是后面再来操作的
    GeekGao
        5
    GeekGao  
       2016-07-06 12:32:21 +08:00
    lz 想复杂了,用 bitmap 来做,这是图个啥啊… 同意楼上观点。
    murmur
        6
    murmur  
       2016-07-06 12:36:42 +08:00   ❤️ 1
    假设一个酒店有 1000 间客房,每个月有 90 条记录(假设早中晚可以分别预定),一年的数据量不过:
    1000*90*12=1080000 ,也就 100 万条记录,任何一个数据库都可以轻松应付
    何况过去的数据不会被查询,实际的数据规模都会远小于这个数
    。。。先把需求琢磨明白,按按计算器再考虑设计好吗
    lecher
        7
    lecher  
       2016-07-06 12:36:59 +08:00
    每个房间每天一条新纪录就没有这个冲突的问题了。
    查询当前空房和房间状态历史记录都方便。
    nimdanoob
        8
    nimdanoob  
    OP
       2016-07-06 16:02:28 +08:00
    @murmur
    90 天的记录,每天的状态用一个列来表示吗
    nimdanoob
        9
    nimdanoob  
    OP
       2016-07-06 16:21:02 +08:00
    @lecher
    那这个表应该如何设计,
    这个表包括一个 roomId 为外键 和 90 个分别表示 90 天方段的字段吗? 这个字段 名应该用 日期名来定义,还是 直接用 1-90 ,哪个更好。 每天也需要删除一个过期的字段,和新建一个字段
    fy
        10
    fy  
       2016-07-06 16:32:27 +08:00 via Android
    楼主图个啥啊,每次修改状态留一条记录就是了,独立设个表
    nimdanoob
        11
    nimdanoob  
    OP
       2016-07-06 16:36:33 +08:00
    创建一个表
    字段是 某个酒店的房间类型(外键) 日期 房态
    这样的话 是不是也是可行的

    我的系统 是多个酒店,数据量大概在 90 万条
    linuxchild
        12
    linuxchild  
       2016-07-06 20:18:15 +08:00 via Android
    每天一个状态不好?
    lecher
        13
    lecher  
       2016-07-06 20:25:17 +08:00 via Android
    楼主想复杂了,数据集一条就三个字段必须,房间 ID ,房间状态,房间状态对应的日期。这个表就存基础数据,每一天的房间状态。
    可以在表里面做一下冗余字段,比如楼层,房型,当天销售价格之类的方便后期做报表计算。

    至于你要的九十天内的房间状态报表,完全可以根据表里面的基础数据做计算,需要的时候再按房间 ID 和日期取指定房间最近九十天的数据出来,用程序处理一下汇总,比如 select * from room_status where room_id= 1 and order_time < xxxx and order_time > yyyyy 。把基础数据取出来自己算。

    这样每天房间的状态都是一条独立的历史记录,删不删都可以,增加和汇总报表的成本也不会太高。
    Livid
        14
    Livid  
    MOD
       2016-07-06 20:34:05 +08:00
    用一张单独的表记录房间状态的变化,房间最新的状态就是这个表中根据 room_id 和时间取到的最后一条记录,所有在现实中产生的变化(入住、退房、打扫……),都对应这张状态表中的记录。
    lecher
        15
    lecher  
       2016-07-06 20:35:25 +08:00 via Android
    万不得已别删数据呀,万一需求改了,要看上一年的房间状态,或者看上月同期的房间状态,没有数据不就疯了。
    让每个房间每天的记录都独立作为一条数据,方便后期计算。

    你这种用位标识合并多个记录到一条数据的做法,更像是把数据序列化在文本中。从零开始做一些小功能的时间会用这种方式。

    既然有数据库,有些计算处理是可以交给数据库做的,没必要什么都在程序做。
    187j3x1
        16
    187j3x1  
       2016-07-06 20:36:32 +08:00
    id
    room_type
    room_is_available
    date
    record_is_delete
    yudahai109
        17
    yudahai109  
       2016-07-07 17:40:01 +08:00
    。。。状态表呗,表里有 id, time, state 这 3 个字段以及一个外键 room_id 。有一个默认状态, 0 代表无人状态, 1 代表有人状态,某一个固定时间,有人入住,增加一条记录, state 为 1 ;入住的人离开,再增加一条记录, state 为 0. 只要状态改变,增加记录。查询的时候,直接小于一个月的 time 所有记录,然后把记录写入到 echarts 中展示出来, echarts 有基于时间轴的图表。比如 0 代表红色, 1 代表绿色。简单的一比。
    我们做物联网的,通常喜欢把设备状态用 redis 记录,用 zset 形式,更简单,也更方面,因为这些记录有个特性,我不需要 update ,不需要复杂的 query ,所以最好用 redis 记录,速度也比较快。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5793 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 01:54 · PVG 09:54 · LAX 17:54 · JFK 20:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.