[請益] 有點複雜的問題(內詳)
很抱歉,用了一個很不知所云的標題,
因為我實在不知道該怎麼簡單描述我現在遇到的問題。
如果有人能給我一個適當的標題,在下必定盡速修正。
問題有點長,請容我描述一下:
假設我有一個紀錄人際關係的資料庫,
紀錄人名與各種不同的關係,比如這樣:
王小明 同學 仇人 朋友 家人
李小英 同學 仇人 朋友 家人
陳小華 同學 仇人 朋友 家人
(亮白字表示對方與我的關係;暗白色表示不存在的關係)
我想在資料庫內儲存這樣的資料,很直覺地可以這麼做:
Name relation1 relation2 relation3 relation4
王小明 1 0 1 0
李小英 0 0 0 1
陳小華 1 1 0 0
但是,如果我想要隨時增加這些關係屬性(比如同事、上司等等),
除了無止盡的增加資料表,並且不斷地修改相關的 SQL 語法以利管理這些資料外,
有沒有比較簡單的方法處理這類問題呢?
我之前想了一個方法,只要一個欄位,就可以紀錄所有的關係。
以王小明為例子,我把原本資料表內的資料集合起來,變成 1010 一個數值,
將這個數字倒轉過來,成為 0101,然後用 bindec 函數轉為十進位,並儲存起來。
要調用這筆資料的時候,只要將這個十進位數字用 decbin 函數解出來,
反轉之後再分割一個個單獨的字元,就可以得到當初儲存的關係了。
這麼處理過後,資料庫可以簡化成這樣:
Name relation
王小明 5 (1010 -> 0101 -> 5)
李小英 8 (0001 -> 1000 -> 8)
陳小華 3 (1100 -> 0011 -> 3)
要反轉一次的理由,是方便以後增加新的關係屬性時,不致導致之前的資料混亂掉。
這部份不是本次問題的重點,暫時就不多做解釋。
這麼做之後,要列舉出所有資料當然是沒有問題的,
只要將關係係數解碼之後傾印出來就可以了。
但是如果要搜尋資料呢?好像變得很複雜……
我想問的是,如果我現在想做一個搜尋的功能,
比如想從資料庫撈出既是同學又是仇人的人名,
有沒有什麼比較簡單的方法可以做到呢?
我想其實我之前用的這個編碼法問題應該很大,所以有可能沒辦法直接撈出資料,
必須先撈出所有資料,將關係係數解碼之後再去判斷。
所以我想知道的是,是不是有比較有效的編碼方式,可以在耗用最少欄位的情況下,
還可以兼具關係係數的擴充性,並且又方便撈資料的?
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 218.162.119.118
推
07/17 21:42, , 1F
07/17 21:42, 1F
→
07/17 21:43, , 2F
07/17 21:43, 2F
推
07/17 21:46, , 3F
07/17 21:46, 3F
推
07/17 21:46, , 4F
07/17 21:46, 4F
→
07/17 21:47, , 5F
07/17 21:47, 5F
樓上兩位已經點出幾個我沒碰過的關鍵字了。
其實我對 SQL 的瞭解僅止於 INSERT、DELETE、SELECT 等超簡單的入門等級,
所以才會用這麼奇怪的方法來處理我的資料……
謝謝兩位提供的資訊,我會再研究看看的。
※ 編輯: chweng 來自: 218.162.119.118 (07/17 21:55)
推
07/18 06:57, , 6F
07/18 06:57, 6F
討論串 (同標題文章)
PHP 近期熱門文章
PTT數位生活區 即時熱門文章