【问题标题】:Database Tables for Reservation site [closed]预订网站的数据库表[关闭]
【发布时间】:2012-01-12 04:04:15
【问题描述】:

我们正在构建一个预订系统。三个模块

  1. 客户
  2. 房间
  3. 预订

客户可以预订一间或多间客房并预订不同的日期。在预订房间时,我想搜索在日期 A 和日期 B 之间可以预订哪些房间。

表格(可能的解决方案) 客户(ID,姓名,......) 房间(id,房间号,房间类型,......) bookings(id, room_id, fromDate, toDate)

目前我有这样的表格

CREATE TABLE IF NOT EXISTS `bookings` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `checkin` datetime NOT NULL,
  `checkout` datetime NOT NULL,
  `advance` int(11) NOT NULL,
  `amount` int(11) NOT NULL,
  `booking_details_id` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;


CREATE TABLE IF NOT EXISTS `bookings_rooms` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `booking_id` int(11) NOT NULL,
  `room_id` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;


CREATE TABLE IF NOT EXISTS `customers` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `age` int(11) NOT NULL,
  `address` varchar(255) NOT NULL,
  `nationality_id` int(11) NOT NULL,
  `mobile` int(20) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

CREATE TABLE IF NOT EXISTS `rooms` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `number` int(4) NOT NULL,
  `category_id` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

需要帮助设计数据库,这是更好的方法。

【问题讨论】:

  • @Bob 抱歉更新了。我需要帮助设计表格

标签: sql database-design schema database-schema


【解决方案1】:

这些架构结构已经允许您找到两个日期之间的空闲房间。

以下查询将检查在开始时间之前预订的房间是否会在开始时间之前免费,或者对于之后预订的房间,它会检查他们是否也在结束日期之后登记入住。

select *
from rooms r
where id not in (
        select room_id
        from bookings_rooms br
            join bookings b on (br.booking_id=b.id)
        where (checkin < :dateA and checkout > :dateA)
            or (checkin > :dateA and checkin < :dateB)
    )

【讨论】:

    【解决方案2】:
    1. 外键名称存在混淆 - booking_id 在逻辑上应该是 bookings_id

    2. 每个表都有重复键 - 您可以删除所有 booking_details_id 等,因为它们扮演 id 的角色

    3. 不以任何方式引用客户

    4. 实现房间的方式 - 这很好,但一切都取决于你对它们做了什么。可能你可以用一些不同的方式来设计它,这样你就可以很容易地得到空房间的列表(你可以从这个结构中得到空闲房间的列表,但是性能并不出色)

    【讨论】:

    • booking_id 命名约定是 CakePHP 框架的 bcos。你对我提到的第一组表格有什么看法?
    • 一、id和booking_id在同一张表的目的是什么???另一个 id 中的信息是多余的!除此之外,您需要在预订表中以某种方式引用客户。除此之外,还有其他设计房间桌子的方法。这取决于您希望对房间进行的典型操作。例如,您可以有一张包含日期和所有房间的表格,如果已预订等,您将在此处标记等等等等,这一切都取决于您需要对房间做什么。
    • 如果预订表中的记录在到期时将被删除,则该结构是最佳的。即使有 1000000 个客户和 1000 个房间,该数据库也不会超过 100 Mb 的已用空间。如果有更多的数据,性能也会很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-05
    • 2013-09-29
    相关资源
    最近更新 更多