一對多業務關系分頁查詢與多端查詢條件
在業務系統中,一對多關系常見的情況是,某個實體有多個關聯實體,且需要對主表進行分頁查詢的同時,子表數據可以作為查詢條件。
針對您提出的問題,現有的兩種設計方案存在不足:
- 方案一:在滿足分頁要求的同時,卻無法滿足子表數據作為查詢條件的訴求。
- 方案二:通過將子表數據存儲在主表中,滿足了查詢條件的要求,但違反數據庫設計范式,影響數據查詢性能。
這里提供一種優化后的設計思路:
優化方案:
在原有兩張表(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