一對多業務關系分頁查詢,如何同時滿足子表數據作為查詢條件?

一對多業務關系分頁查詢,如何同時滿足子表數據作為查詢條件?

一對多業務關系分頁查詢與多端查詢條件

在業務系統中,一對多關系常見的情況是,某個實體有多個關聯實體,且需要對主表進行分頁查詢的同時,子表數據可以作為查詢條件。

針對您提出的問題,現有的兩種設計方案存在不足:

  • 方案一:在滿足分頁要求的同時,卻無法滿足子表數據作為查詢條件的訴求。
  • 方案二:通過將子表數據存儲在主表中,滿足了查詢條件的要求,但違反數據庫設計范式,影響數據查詢性能。

這里提供一種優化后的設計思路:

優化方案:

在原有兩張表(user和tag)的基礎上,新增一張關聯表(關聯表采用“user_id”和“tag”組合作為主鍵):

user表: | a_id | name | |---|---| | 1    | 小明 | | 2    | 小李 | | 3    | 小張 |  tag表: | id | tag | |---|---| | 1    | 活潑 | | 2    | 可愛 |  關聯表: | user_id | tag | |---|---| | 1    | 活潑 | | 1    | 可愛 | | 2    | 活潑 | | 3    | 可愛 |

使用關聯表設計的好處在于:

  • 滿足分頁查詢需求,在user表中進行分頁查詢。
  • 滿足子表數據作為查詢條件的需求,通過在關聯表中加入查詢條件,可以查詢出指定子表數據的父表記錄。
  • 保證數據完整性,關聯表避免了主表中數據冗余,保持了第一范式。

查詢sql

SELECT     u.*,     GROUP_CONCAT(t.tag) AS tags FROM     user AS u LEFT JOIN     關聯表 AS r ON u.a_id = r.user_id LEFT JOIN     tag AS t ON r.tag = t.id WHERE     r.tag = '活潑'     /* 其他查詢條件 */ GROUP BY     u.a_id,     u.name LIMIT     #{current}, #{size}  -- 分頁參數

使用說明:

通過在關聯表中添加一個新的查詢條件,可以實現多端的查詢操作。例如,要查詢“name”字段中包含“可愛”的“user”記錄,可以在where子句中添加條件:“r.tag = ‘可愛’”。

這樣既滿足了一對多業務關系分頁查詢的需求,又可以將多端的子表數據作為查詢條件使用,同時保證了數據完整性和性能優化

? 版權聲明
THE END
喜歡就支持一下吧
點贊15 分享