作者pakker (找寻蔚蓝天空)
看板PHP
标题Re: [请益] 有点复杂的问题(内详)
时间Wed Jul 18 20:26:54 2007
※ 引述《derekhsu (断头不过碗大疤)》之铭言:
: ※ 引述《dinos (守护神)》之铭言:
: : 顺道问一下,若是 relation 超过 64 种,那 relation 要怎麽处理比较好呢?
: : 用 char binary 吗?
: 有一个比较快的方法,直接作第三阶正规化把Ralational Table建出来:
: 这需要三个Table,例:
: 1.PEOPLE 纪录人员
: [ID], NAME, .....
: 2.RELATION 记录关系的种类
: [ID], RELATION
: 3.RELATION_PEOPLE 纪录人与人间关系的关联资料表
: [PEOPLE_ID_SOURCE].[PEOPLE_ID_TARGET],[RELATION_ID]
: 建出来的表比较复杂,但其实是比较符合正规化原则,也比较好进行操作的
请问我要找出是同学又是仇人又是邻居
一次满足三种条件的所有人
该怎麽进行操作?
正规化目的在减少重复的资料,资料处理的效率常常会随之下降,
甚至会在正规化完之後,为了效率,把某些特定表格去正规化.
但在这边用正规化,不仅没有减少资料量,查询也不是很方便?
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 59.121.24.164
1F:推 knockout:select * from people,relation,relation_people where 07/18 22:48
2F:→ knockout:people.id = relation.id and relation.relation = 07/18 22:49
3F:→ knockout:relation_people.relation_id where 07/18 22:50
4F:→ knockout:relation_people.people_id_target in (查询的关联性); 07/18 22:51
5F:→ knockout:第3行的WHERE打错了 是 and .. 07/18 22:53
6F:→ knockout:做正规化的确会增加效率 ~~ select时间以资料笔数愈多 07/18 22:53
7F:→ knockout:差异愈大 ~ 07/18 22:54
8F:→ knockout:最後 .. 这是PHP版 ... 不是资料库版 =_= 07/18 22:55
9F:推 leosirius:厄楼上的SQL语法跟原po要的答案其实不一样.. 07/19 10:18
10F:推 knockout:我怎麽知道他要定义的仇人 邻居是怎麽定 -.- 07/19 10:32
11F:→ knockout:反正关联性都在第三个TABLE ~~ 所以我用in 来做查询~ 07/19 10:32
12F:→ knockout:如有误 ~~ 请更正 ~~ Y 07/19 10:33
13F:推 leosirius:我意思是IN没办法做到原po要的关联性.. 07/19 11:11
14F:→ leosirius:我的想法是select出同学、仇人、..然後做intersect 07/19 11:12
15F:推 knockout:喔 他是说又是仇人 又是邻居又是同学喔 07/19 11:39
16F:→ knockout:那要改成 AND relation_people.people_id_target = 1 AND 07/19 11:39
17F:→ knockout:relation_people.people_id_target = 2 AND 07/19 11:40
18F:→ knockout:relation_people.people_id_target = 3 07/19 11:40
19F:→ knockout:呃 我错了 上面请忽略掉 ~_~" 07/19 11:46