[請益] 有點複雜的問題(內詳)

看板PHP作者時間18年前 (2007/07/17 21:38), 編輯推噓4(402)
留言6則, 3人參與, 最新討論串1/6 (看更多)
很抱歉,用了一個很不知所云的標題, 因為我實在不知道該怎麼簡單描述我現在遇到的問題。 如果有人能給我一個適當的標題,在下必定盡速修正。 問題有點長,請容我描述一下: 假設我有一個紀錄人際關係的資料庫, 紀錄人名與各種不同的關係,比如這樣: 王小明 同學 仇人 朋友 家人 李小英 同學 仇人 朋友 家人 陳小華 同學 仇人 朋友 家人 (亮白字表示對方與我的關係;暗白色表示不存在的關係) 我想在資料庫內儲存這樣的資料,很直覺地可以這麼做: 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
一切都複雜化了 數字就是binary部用甚麼編解碼
07/17 21:42, 1F

07/17 21:43, , 2F
一切都是 AND/OR operation
07/17 21:43, 2F

07/17 21:46, , 3F
ERD: 人(M)-------(M)關係
07/17 21:46, 3F

07/17 21:46, , 4F
1.SQL可以用BIT OP 2.複雜的編碼可以用SQL的UDF去做搜尋
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
文章代碼(AID): #16dCP0Bw (PHP)
文章代碼(AID): #16dCP0Bw (PHP)