作者chweng ()
看板PHP
标题[请益] 有点复杂的问题(内详)
时间Tue Jul 17 21:38:05 2007
很抱歉,用了一个很不知所云的标题,
因为我实在不知道该怎麽简单描述我现在遇到的问题。
如果有人能给我一个适当的标题,在下必定尽速修正。
问题有点长,请容我描述一下:
假设我有一个纪录人际关系的资料库,
纪录人名与各种不同的关系,比如这样:
王小明
同学 仇人
朋友 家人
李小英 同学 仇人 朋友
家人
陈小华
同学 仇人 朋友 家人
(亮白字表示对方与我的关系;暗白色表示不存在的关系)
我想在资料库内储存这样的资料,很直觉地可以这麽做:
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
1F:推 pakker:一切都复杂化了 数字就是binary部用甚麽编解码 07/17 21:42
2F:→ pakker:一切都是 AND/OR operation 07/17 21:43
3F:推 leosirius:ERD: 人(M)-------(M)关系 07/17 21:46
4F:推 pakker:1.SQL可以用BIT OP 2.复杂的编码可以用SQL的UDF去做搜寻 07/17 21:46
5F:→ leosirius:接下来你应该知道怎麽做了.. 07/17 21:47
楼上两位已经点出几个我没碰过的关键字了。
其实我对 SQL 的了解仅止於 INSERT、DELETE、SELECT 等超简单的入门等级,
所以才会用这麽奇怪的方法来处理我的资料……
谢谢两位提供的资讯,我会再研究看看的。
※ 编辑: chweng 来自: 218.162.119.118 (07/17 21:55)
6F:推 JoeHorn:这种议题跟资料库正规化有关,去资料库板问吧~ 07/18 06:57