Database粗略介紹 Relational Database 關聯式資料庫 RDBMS
情境題
請針對某app產品的資料設計DB structure:
每個member(用戶)可以使用多個device進行登入
Device登入時會攜帶一筆firebase的device token,作為未來server端使用firebase cloud message(推播功能)的用途
Member
Device
1
多
id
account
password
deviceToken
memberId
客服通知
客服通知內會夾帶複數個連結網址
每封客服通知都是針對特定的多個用戶製作,只有通知指定的用戶能收到並點開通知內容
Notification
NotificationUrl
1
多
url
notificationId
title
body
id
Member
account
password
id
MemberNotification
memberId
notificationId
但..事總與願違
情境二
一個層級一張table?
好吧我們從一張table當做切入點去設計
直接加一個欄位紀錄直屬上線的memberId!
或另外建立一個表描述單層上下線關係
adjacency list
CONNECT BY + PROIR
LEVEL
START WITH
NOCYCLE
& CONNECT_BY_ISCYCLE
& SYS_CONNECT_BY_PATH
除非你限制了用戶最高下線人數,否則
無法在有限次數的 Query 中得到所有下線的資料。
但是客戶很雞掰,他不會讓你限制這種鳥規定的,他只會覺得你爛
Problem
當專案成長到一定階段,hierarchy model到達一定的水準後,這樣的query便會成為一個效能上的buttleneck
Solutions
1. Path Enumeration column
Fetch comment#7 and its ancestors
Fetch comment#4 and its descendants
透過Expression去解決相關的層級問題
Advantages
Disadvantages
2. Create Closure Table
記錄所有的上下層關係(無論層級)
Advantages
Disadvantages
就是看客戶願不願意吐錢出來
How about NoSQL?
The End!!
謝謝大家~