我们正在建立预订系统。有三个模块
客户可以预订一个或多个房间以及不同的日期。在预订房间时,我想搜索在日期A和日期B之间预订的房间。
表格(可能是解决方案) 客户(身份证,姓名,.....) 房间(id,roomNo,roomType,....) 预订(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 ;
需要帮助来设计数据库,这是一种更好的方法。
答案 0 :(得分:4)
这些架构结构已经允许您在两个日期之间找到免费房间。
以下查询将检查在开始时间之前预订的客房是否在开始时间之前是免费的,或者对于之后预订的客房,它会检查他们是否也在检查结束日期之后。
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)
)
答案 1 :(得分:1)
外键名称存在混淆 - booking_id应该是逻辑上的bookings_id
每个表都有重复键 - 您可以删除所有booking_details_id等,因为它们扮演id的角色
客户未以任何方式被引用
你实施房间的方式 - 很好,但一切都取决于你用它们做什么。可能你可以用不同的方式设计它,这样你就可以轻松获得空房间清单(你可以从这个结构中获得免费房间清单,但表现并不壮观)