DRY - 如何将重复的代码提取到......存储的函数可能?

问题描述 投票:3回答:2

这些陈述中的每一个的第三行完全相同:

语句1

SELECT * FROM `uploads`
WHERE `uid` = :uid
AND `deleted` <> 1  AND `archived` <> 1

语句2

SELECT * FROM `uploads`
WHERE `folder_id` = :folder_id
AND `deleted` <> 1  AND `archived` <> 1

第三行也用于许多其他语句中,假设30个不同的语句;在这个人为的例子中,它意味着“我们从上传表中获取所有尚未删除或存档的文件”。如果将来我们需要为它添加第三个限定符(例如AND uploadsuccess = 1),我们将需要编辑30个不同的sql语句。根本不干。我们如何在这里使用DRY原则,通过SQL(在我们的情况下,MySQL,如果这是一个重要因素)?

谢谢你的帮助。

sql
2个回答
3
投票

我建议使用VIEW:

CREATE OR REPLACE VIEW uploads_current AS
  SELECT * FROM `uploads
  WHERE `deleted` <> 1 AND `archived` <> 1;

然后,您可以使用其他条件查询它:

  SELECT * FROM `uploads_current`
  WHERE `uid` = :uid;

您可以稍后重新定义视图:

CREATE OR REPLACE VIEW uploads_current AS
  SELECT * FROM `uploads
  WHERE `deleted` <> 1 AND `archived` <> 1 AND uploadsuccess = 1;

然后查询uploads_current的所有代码将隐式包含相同的条件,不需要更改代码。

阅读更多关于VIEWs:https://dev.mysql.com/doc/refman/5.7/en/create-view.html


3
投票

这是一个常见问题,我们希望存储所有数据,但99%的情况我们都会过滤掉某个数据子集。

我经常使用的解决方案是创建一个包含逻辑的视图,然后对其进行查询。例如:

CREATE VIEW `uploads_view` AS
SELECT * FROM `uploads`
WHERE `deleted` <> 1
AND `archived` <> `;

SELECT * FROM `uploads_view` WHERE `uid` = :uid;

SELECT * FROM `uploads_view` WHERE `folder_id` = :folder_id
© www.soinside.com 2019 - 2024. All rights reserved.