sql之哪种方法在数据库性能方面更好之一个表按操作分组或多个表可序列化事务

dflying 阅读:79 2025-01-19 22:14:33 评论:0

我正在开发一个基于 SQL 数据库的预订系统(对具体的数据库没有限制)。

架构:

工作流程:

现在我正在使用一个特殊的“actual_reservations” View ,该 View 基于带有过滤逻辑的自定义分组依据来识别实际放置的预订,例如:

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$$

我在“操作”表上已经有了很好的索引,但我不确定我使用单个表来处理与预订相关的所有操作的方法是否真的具有可扩展性。我听说过一种方法,我将所有待定和实际批准的预订存储到单独的表中,然后手动将它们同步到事务中。

我的问题是关于您的 POV 中哪种方法在数据库性能、可扩展性和良好的数据设计方面更好?

请您参考如下方法:

我建议:

  • 不要想当然地接受任何人的回答;相反,使用真实世界的数据进行基准测试,以衡量实际性能。

  • 无论答案是什么,它都没有您担心的那么重要。它肯定不会区分可扩展系统和不可扩展系统。

  • 如果事实证明将某种记录分为待处理和已批准的记录实际上有任何优点,您将能够通过行分区实现它(查找) 这样您就可以将所有内容保存在一个逻辑表中,避免以性能的名义搞乱您的架构。


标签:数据库
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号