iT邦幫忙

0

組織各層級有各自不同的設定值,邏輯上該如何設計DB取得效能、花費與維護上的平衡

資料庫是使用AWS的dynamodb
情境如下(我盡量把需求實體化說明,也順便整理自己的思路):

  1. 假設組織目前只有分三個層級: 老闆x1、中階管理職xN(成員:E、F)、底層員工xN(成員:B、C、D)
  2. 中階管理職成員: E、F
  3. 底層員工成員: B、C、D
  4. 中階管理職E底下管理底層員工B、C
  5. 中階管理職F底下管理底層員工D
  6. 在員工網站內,不同層級使用者可以看到不同的畫面
  7. 不同層級的使用者可自訂部分看到的畫面,但各個設定值有重疊的地方

舉例來說,最複雜的情況,層級高且後設定,會覆蓋掉層級低、早設定的:

  1. 可設定網站顯示的語言,當老闆設定成英文時,中階管理職、底層員工都會看到英文
  2. (續上)當底層員工A將設定改成中文,老闆是英文,中階管理職未設定也是英文,只有底層員工A是中文,其他底層員工BCD是英文
  3. (續上)當老闆又將語言改為日文,中階管理職未設定即看到日文,底層員工A即使設成中文,也會和其他底層員工BCD一樣看到日文
  4. (續上)當中階管理職E將語言改為英文,此時老闆是日文,中階管理職E是英文、F是日文,底層員工B、C是英文,底層員工是F日文
    當然還有諸多可設定的項目,有的像上述那樣會有條件的彼此覆蓋,也有的是獨立不受干擾

有考慮過當老闆更改設定時,將老闆的設定更新到所有中階管理職和底層員工
當中階管理職更改設定時,將中階管理職的設定更新到其管理的底層員工
但這樣個人會覺得目前總數少還沒問題,要是底層員工有數千數萬個,每次更新覆寫的次數就會很多,然而又不一定每個底層員工都會經常讀取設定值
(雖然這邊需求寫成老闆和員工,但實際上是產品而不是組織,所以確實有可能達到數千數萬個的等級,而不是想太遠了XD)

也考慮過給如上敘「語言」加上timestamp,在底層員工讀取設定時用來判斷該用自己的設定值或較高層級的設定值
但程式上的邏輯可能會變得難以閱讀、理解,且資料庫上上下下都有相同的欄位,但數值卻不同,其他人員維護起來可能也會感到困惑

希望能得到建議,取得查詢效能、費用及未來維護上的平衡,感謝

看更多先前的討論...收起先前的討論...
有個想法,每個層級都存在一個預設員工,變更設定的時候只更新預設員工,其他員工只在登入的時候重新取得預設員工的新權限,不過在權限變更的時候可能要想想怎麼處理「已登入」的員工
一個系統它有所謂的程序權限,如果你要權限繼承發生作用應該是做在這裡
而有些是 USER 喜好設定,這各跟程序權限無關吧,喜好設定應該是每個人獨有,不該做權限繼承的
簡單說啦你系統男女有別,就跟廁所一樣,總不能老闆今天上女廁,它底下的員工也要上女廁,老闆明天去男廁,底下員工又跟著去了,那問題是老闆是男是女 ?
但是如果是會計系統,老闆進來就是唯獨啊,難道還要開傳票修改權限 ?
也不會因為老闆是男的就有權限改,是女的就只能看看而已吧
wingkawa iT邦新手 3 級 ‧ 2021-03-25 13:54:28 檢舉
>>耿直小伙
感謝,這主意似乎還不錯
>>窮嘶發發發
感謝您的建議,雖然舉例是用顯示語言這種很個人喜好的東西,但實際上需求方確實是這樣:
老闆: 「嘿,從今天開始,新進員工預設語言是英文哦!」
主管E: 「Yo,我們部門都是nipon郎爹斯,所以我們部門預設語言是日文爹斯!」
員工B: 「最近學德文,改成德文當練習好了。」
主管E: 「老闆強力要求的啦,最後我們部門還是用英文就好的啦!」
員工B的顯示語言就只好這樣被上面玩弄,需求就是有些功能是上面的變更要同步到下面QQ
不然上面會有老闆來報bug說: 「阿我昨天才重設成希臘文,怎麼那個員工B登入顯示的是德文?你看你看設定頁面上面明明是寫希臘文啊!」
基本上管理是這樣,總有特權人士,如果老闆會這麼玩系統,我的建議是最好可以建議老闆不要這麼玩,有些東西應該是方便員工輸入就好,這麼玩,看不出意義在哪,難道貴司每月員工都是多語言天才,隨便一各都能會幾十種語言,這我就無話可說了,另外也許不是老闆非要英文德文之類的,是因為在你們的系統也許無法自動翻譯成老闆需要的語言,所以他覺得變看看,也許底下的人會輸入老闆看得懂的語言吧
bizpro iT邦大師 1 級 ‧ 2021-03-28 08:27:21 檢舉
您應該用role和group來授權. 而不是直接更新user的權限來授權.
如果您要加快查詢授權的"速度", 在role和group加上更新檢核的判斷, 如果有更新, 就"計算"更後的個人權限, 這計算後的個人權限可以用redis來cache,. 也可以用session來紀錄. 影響只是個人. 當然, 應該是能即時查詢檢核碼. 這樣就可以在銅一個session中即時控制權限的改變
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
1
海綿寶寶
iT邦大神 1 級 ‧ 2021-03-25 11:14:21
最佳解答

你寫了那麼多
歸納起來只有一句話,就是
「如果必須二選一,這兩項動作的優先順序」

這兩項動作就是
1.更改設定
2.查詢設定

你要自己判斷的是
1.那項動作的「頻率」較高?(注意,就是頻率,跟「資料筆數」無關)
2.如果執行一次動作的時間一樣「長」(eg.10 秒鐘),那項動作使用者比較無法接受?

如果讓我選的話
我會選擇減少「頻率高的那項動作」的執行時間
And 我猜是「查詢設定」
如果我猜對的話
就會把複雜(有多複雜就多複雜)的程式邏輯寫在「更改設定」動作裡
讓「查詢設定」的程式越單純越好

另外我好奇問一下
你後來有沒有去讀在職碩

wingkawa iT邦新手 3 級 ‧ 2021-03-25 14:03:36 檢舉

感謝,確實查詢的頻率會比更改高的多
但ddb不能像sql那樣一次查詢就能把符合條件的資料全改了(還是說……其實可以?)
所以才會想要盡可能減少費用的同時又好維護這樣

後來工作偏忙、家裡又出事情,心意也不決,所以還是沒去報在職碩
謝謝您的關心QQ

盡可能減少費用

我不太懂,為什麼你一直在費用上面打轉

ddb 的計價方式中分兩種
1.有基本費的
寫入容量單位 (WCU) 每個 WCU 0.00065 USD
讀取容量單位 (RCU) 每個 RCU 0.00013 USD
2.沒基本費的
寫入請求單位 每百萬個寫入請求單位 1.25 USD
讀取請求單位 每百萬個讀取請求單位 0.25 USD

與其在這個地方精打細算
就為了省那幾百塊美金/月
公司寧願節省員工每次查詢資料時花費的時間
把省下來的時間拿去賺錢還比較實在

tkunlin iT邦新手 4 級 ‧ 2021-03-26 10:50:53 檢舉

大多數公司都是這樣的.

1

有時候,寫程式要先厘清好你的邏輯。

不覺得你4點的要求,已經有衝突性了嘛?
就如 a=b b=c a<>c 的意思一樣了。不要說你辦不到,我也辦不到這件事。

就已經不需要去討論程式規劃的問題了。

wingkawa iT邦新手 3 級 ‧ 2021-03-25 14:06:01 檢舉

您好,我想可能是4點的要求有先後順序性,但發問時沒有特別寫明,所以會有衝突。
已經編輯原文了,討論那邊也有補充一點內容,謝謝您。

0
idlewu
iT邦新手 5 級 ‧ 2021-03-26 10:21:56

感覺好像在寫BOM表喔
如果是我,我會做一個異動檔,有四個欄位,分別是階層,屬性,屬性值,修改時間

初始化將所有的值寫入,底層員工A沒有說是哪個階層,我就不提了
階層 屬性 屬性值 修改時間
a 老闆 1 語言 英文 2021/03/10
b E 1.1 語言 英文 2021/03/10
c F 1.2 語言 英文 2021/03/10
d B 1.1.1 語言 英文 2021/03/10
e C 1.1.2 語言 英文 2021/03/10
f D 1.2.1 語言 英文 2021/03/10
g 老闆 1 語言 日文 2021/03/11
h E 1.1 語言 英文 2021/03/12

程式邏輯
假設要找B的屬性,先將最後修改B的時間d(2021/03/10)和屬性(英文)抓出
然後逐階層比對
因為B的階層為1.1.1
所以先找階層為1,最近修改時間g(2021/03/11),時間比d後,所以異動時間改成2021/03/11,屬性改為(日文)
再找階層為1.1,最近修改時間h(2021/03/11),因為時間比g後,所以異動時間改成20201/03/12,屬性改為(英文)
因為已到上一階,所以屬性為(英文)

因為D的階層為1.2.1,最後修改D的時間f(2021/03/10)和屬性(英文)
所以先找階層為1,最近修改時間g(2021/03/11),時間比f後,所以異動時間改成2021/03/11,屬性改為(日文)
再找階層為1.2,最近修改時間c(2021/03/10),時間在g前,所以異動時間不變,屬性不變
因為已到上一階,所以屬性為(日文)

我要發表回答

立即登入回答