PostgreSQL大學選課相關性應用實踐
標籤
PostgreSQL , 選課 , UDF , 陣列 , 相關性 , 圖式搜尋
背景
大學生選課,一門課程可同時有若干學生選修,一個學生可能同時選多門課程,學生和課程的關係是多對多的關係。
1、如何找出每一門課程相關的課程(即這門課程的學生,還選了其他一些什麼課程?)同時要求按相關性排序。
2、如何找出每一門課程相關的課程(即這門課程的學生,還選了其他一些什麼課程?這些課程的學生又選了一些什麼課程,遞迴)同時要求按相關性排序。
DEMO
對於第一個要求,實現很簡單:
10萬位學生,1000門課,平均每個學生選5門課。
求每門課程的相關課程,並按相關性排序(選了該課程的學生中,還選了什麼課程,按被選次數倒排序)。
1、建表,儲存的是選課資訊:
create table xuanke(
std_id int8, -- 學號
cos_id int -- 課程
);
2、插入50萬記錄
insert into xuanke select random()*99999, random()*999 from generate_series(1,500000);
3、單個學生選了什麼課,使用陣列儲存:
create table xuanke_cos_id (
std_id int8 primary key,
cos_id int[]
);
insert into xuanke_cos_id select std_id, array_agg(cos_id) from xuanke group by 1;
4、每門課,有哪些學生選了,使用陣列儲存:
create table xuanke_std_id (
cos_id int primary key,
std_id int8[]
);
insert into xuanke_std_id select cos_id, array_agg(std_id) from xuanke group by 1;
5、通過某門課的學生,得到這些學生選了什麼課,並聚集,按相關性輸出:
create or replace function get_cos_id2(int8[]) returns text[] as $$
select array_agg(unnest||`:`||cnt order by cnt desc) from
(select unnest(cos_id) as unnest, count (*) as cnt
from xuanke_cos_id where std_id = any ($1) group by 1
) t;
$$ language sql strict;
6、拿結果:
select cos_id, get_cos_id2(std_id) from xuanke_std_id;
結果例子:
251 | {251:495,348:9,708:8,372:7,816:7,431:6,184:6,600:6,114:6,649:6, .....
453 | {453:499,519:7,750:7,816:7,375:7,109:7,705:7,650:7,908:7, .....
使用平行計算,以上查詢毫秒級。
相關案例
如果是要實現第二個需求,也就是需要遞迴,可以參考如下方法:
《PostgreSQL 圖式搜尋(graph search)實踐 – 百億級圖譜,毫秒響應》
WITH RECURSIVE search_graph(
std_id, -- 點1
cos_id, -- 點2
depth, -- 深度,從1開始
path, -- 路徑,陣列儲存
cycle -- 是否迴圈
) AS (
select std_id,cos_id,depth,path,cycle from (
select
std_id,
cos_id,
1 depth,
array[row(std_id,cos_id)] path,
false as cycle
from xuanke
where cos_id=?
) t
UNION ALL
select std_id,cos_id,depth,path,cycle from (
select
g.std_id,
g.cos_id,
sg.depth+1 depth,
sg.path||array[row(g.std_id,g.cos_id)] path,
(row(g.std_id,g.cos_id) = ANY(path)) as cycle
from xuanke as g, search_graph AS sg
where
g.std_id = sg.std_id
AND NOT cycle
-- and sg.depth <= ?
) t
)
SELECT * FROM search_graph;
資料量非常龐大,返回時間很久。實際上層級很深後,意義不大。
如果需要限制每個層級的返回數,限制層級,限制相關性權重等,請參考:
《PostgreSQL 圖式搜尋(graph search)實踐 – 百億級圖譜,毫秒響應》
相關文章
- PostgreSQL copy相關選項SQL
- 大眾點評搜尋相關性技術探索與實踐
- Android 應用相容性最佳實踐 | 中文教學視訊Android
- PostgreSQL家譜、族譜類應用實踐-圖式關係儲存與搜尋SQL
- PostgreSQL死鎖相關SQL
- 2019年實用性超強的五大機器學習課程機器學習
- 個性化推薦系統實踐應用
- 關於學生選課管理系統的用例圖
- 深度學習的應用與實踐深度學習
- PostgreSQL AutoVacuum 相關引數SQL
- HttpServletRespnse 物件 相關基本應用HTTPServlet物件
- HTTP相關的應用程式HTTP
- .NET雲原生應用實踐(三):連線到PostgreSQL資料庫SQL資料庫
- PostgreSQL相似人群圈選,人群擴選,向量相似使用實踐-cubeSQL
- 泰康保險大資料應用實踐分享大資料
- ClickHouse在大資料領域應用實踐大資料
- TiDB應用實踐TiDB
- GroovyShell 應用實踐
- 大資料測試 - 相關性評估大資料
- 應用層相關協議分析協議
- 用圖機器學習探索 A 股個股相關性變化機器學習
- 音視訊學習 -- 弱網對抗技術相關實踐
- 數學建模 資料處理模型之變數相關性類(灰色相關聯、相關性分析)模型變數
- 波士頓大學:研究發現樂觀和長壽存在相關性
- 財務建模最佳實踐 - DDD相關建模
- 統計學三大相關係數之Pearson相關係數、Spearman相關係數
- 【python基礎語法實踐應用】合肥工業大學python實驗一題解Python
- Android快應用實踐Android
- Spring AOT應用實踐Spring
- matlab相關性分析Matlab
- GitOps 應用實踐系列 - Argo CD 上手實踐GitGo
- HTML5應用 + Cordova = 平臺相關的混合應用HTML
- HTML5應用+Cordova=平臺相關的混合應用HTML
- 應用實踐——新東方實時數倉實踐
- Flutter-Android 應用打包相關問題FlutterAndroid
- 【PG管理】postgresql資料庫管理相關SQL資料庫
- Android應用保活實踐Android
- 大資料應成為大學課程的重中之重大資料
- uoj專案部署中題目管理的相關學習與應用