【发布时间】:2017-11-03 11:59:42
【问题描述】:
我正在开发一个基于 SQL 数据库的预订系统(对特定数据库没有限制)。
现在我正在使用一个特殊的“actual_reservations”视图,该视图基于带有过滤逻辑的自定义分组来识别实际放置的预订,例如:
CREATE VIEW `reserv-io`.`actual_reserved_resources` AS
SELECT
`r`.`id`,
`a`.`resource_id`,
`a`.`type_id`,
`a`.`status_id`,
`a`.`reservation_start`,
`a`.`reservation_end`
FROM `reserv-io`.`actions` `a`
JOIN (SELECT
`r`.`id` `id`,
MAX(`a`.`id`) `action_id`
FROM `reserv-io`.`reservations` `r`
JOIN `reserv-io`.`actions` `a` ON `r`.`id` = `a`.`reservation_id`
WHERE (`r`.`id` NOT IN
(SELECT `r`.`id` `id`
FROM `reserv-io`.`reservations` `r`
JOIN `reserv-io`.`actions` `a` ON `r`.`id` = `a`.`reservation_id`
WHERE (`a`.`status_id` IN
(SELECT `id`
FROM `reserv-io`.`reservation_statuses`
WHERE `name` = 'Canceled')))
AND `a`.`status_id` IN
(SELECT `id`
FROM `reserv-io`.`reservation_statuses`
WHERE `name` = 'Approved' OR `name` = 'Accepted'))
GROUP BY `r`.`id`) `b`
ON `a`.`id` = `b`.`action_id`
JOIN `reserv-io`.`reservations` `r` ON `r`.`id` = `a`.`reservation_id`;
并确定是否与其他保留有任何重叠,程序如下:
CREATE PROCEDURE HAS_OVERLAPPING_RESERVATION_WITH_TYPE_SELF_CHECK(
IN RESERVATION BIGINT,
IN RESOURCE INT,
IN RESERVATION_TYPE INT,
IN STARTS_AT DATETIME,
IN ENDS_AT DATETIME,
OUT RESULT BIT)
BEGIN
SELECT CASE WHEN EXISTS(
SELECT *
FROM actual_reserved_resources r
WHERE r.resource_id = RESOURCE
AND r.type_id = RESERVATION_TYPE
AND r.reservation_start < ENDS_AT
AND r.reservation_end > STARTS_AT
AND r.id <> RESERVATION)
THEN TRUE
ELSE FALSE END
INTO RESULT;
END$$
我已经在 'actions' 表上有了很好的索引,但我不确定我使用单个表处理与预订相关的所有操作的方法是否真正具有可扩展性。我听说过一种方法,我将所有待处理和实际批准的预订存储到单独的表中,然后手动将它们同步到事务中。
我的问题是关于您的 POV 中的哪种方法在数据库性能、可扩展性和良好的数据设计方面更好?
【问题讨论】:
标签: sql database-design architecture database-performance