8
回答
问题来了,大家都看过来,讨论讨论技术。
注册华为云得mate10,2.9折抢先购!>>>   
一条记录,比方说文章,有多个分类,数据表怎么设计。几种方法,每种方法的优缺点。
<无标签>
举报
共有8个答案 最后回答: 3年前
单独建一个文章跟分类的关系表.
--- 共有 6 条评论 ---
wharf_zhang回复 @雨下得狂 : 这是一种索引。我就是这么干的,只不过我搞得非常复杂,而已。 3年前 回复
eechen回复 @雨下得狂 : 你说的分隔符(比如逗号)连接字符串也可以,用explode和implode就能在array和string直接转换,而且该字段还能使用MySQL内部函数FIND_IN_SET,比如 SELECT FIND_IN_SET('b','a,b,c,d') 将返回 2。 3年前 回复
小小李探花回复 @eechen : 嗯,平常用的就是建关系表和分隔符连接字符串存成一个字段。今天面试,面试官说要用一个字段存二进制。 3年前 回复
GITTODO支持 3年前 回复
eechen回复 @雨下得狂 : 要不试试文章表里设一个分类字段,里面序列化serialize()存储文章所属的分类. 3年前 回复

自己做个树的数据结构,直接组织。哈。这种层级关系你用二维表即便是索引也累死。。。

--- 共有 2 条评论 ---
中山野鬼回复 @eechen : 关联数组并不好做。我现在也在给别人做个带分类的二维表组织管理的模块,很简单,把数据表完全读取到自己构建的表存储中,每个记录就是个元素,整个二维表就是集合。然后该集合的元素再按指定规则做树集合化处理就ok。一个集合上可以存在多种分类规则的树集合化处理。 3年前 回复
eechen用PHP的关联数组就能描述这种关系,然后数组通过serialize序列化成字符串存入数据库的分类字段。查询分类时unserialize反序列化该字段变为数组进行操作。而数组操作是PHP的拿手好戏。 3年前 回复

引用来自“中山野鬼”的评论

自己做个树的数据结构,直接组织。哈。这种层级关系你用二维表即便是索引也累死。。。

postgresql支持树状查询
@中山野鬼 感觉挺好做的呀:
$_VRoot = array(
    '动物' => array(
        '脊椎动物' => array(
            '哺乳动物' => '',
            '火星人' => ''
        )
    )
);
print_r($_VRoot['动物']['脊椎动物']);

引用来自“eechen”的评论

@中山野鬼 感觉挺好做的呀:
$_VRoot = array(
    '动物' => array(
        '脊椎动物' => array(
            '哺乳动物' => '',
            '火星人' => ''
        )
    )
);
print_r($_VRoot['动物']['脊椎动物']);

基于我自己的基础库,代码也不复杂,无非这么几行:

_i32 main(_i32 argc,_s argv[]){
	_P P;
	P = create_classtree(1,8,_gs_null);
	new_classtree(P,"动物","哺乳动物");
	new_classtree(P,"脊椎动物","哺乳动物");
	new_classtree(P,"动物","脊椎动物");
	new_classtree(P,"脊椎动物","火星人");
	print_classtree(P);
	del_classtree(P,0,"脊椎动物");
	print_classtree(P);
	return 0;
}



这是个专门的分类树模块的利用,它大部分的代码实际上是一个树结构模块的实例化。

只需要如下处理:

#define __inittreesets in_init_classtree
#define _STATIC_PREFIX
#include "gs_TsetsTemp.h"
#define __call_print_node print_node

#define __create_treesets in_create_classtree
#define __call_inittreesets in_init_classtree
#define __extend_treesets in_extend_classtree
#define __delete_treesets in_del_classtree
#define __new_treesets in_new_classtree
#define __move_treesets in_move_classtree
#define __isused_treesets in_isused_classtree
#define __getlchl_treesets in_getlchl_classtree
#define _STATIC_PREFIX
#include "gs_TsetsTemp.h"
#define __isfull_treesets full_classtree
#define __print_treesets _print_classtree
#define  __getfat_treesets getfat_classtree
#define __getNext_treesets getNext_classtree
#define __getTail_treesets getTail_classtree
#include "gs_TsetsTemp.h"
_P create_classtree(_I us,_I un,_I nsID){
	_P Pre = 0;
	if (nsID == _gs_null){
		nsID = newSpace_NameS();
	}
	_error(nsID == _gs_null,_create_classtree_END,"namespace create error!");
	Pre = in_create_classtree(us,un,sizeof(_CTREEHEADER),1,un);
	_error(Pre == 0,_create_classtree_END,"create treespace error!");
	_getnsID(Pre) = nsID;
	_getPNameID(Pre) = _getSNameID(Pre) = _gs_null;
_create_classtree_END:
	if (Pre == 0){
		if (nsID != _gs_null){
			freeSpace_NameS(nsID);
		}
	}
	return Pre;
}



而gs_TsetsTemp.h里面都是函数模版,类似如下:

#ifdef __create_treesets
#ifndef __call_inittreesets
#error need define __call_inittreesets
#endif
#define __create_sets __create_treesets
#define __call_initsets __call_inittreesets
#if (_Is_static == 0)
#undef _STATIC_PREFIX
#endif
#include "gs_setsTemp.h"
#if (_Is_static == 0)
#define _STATIC_PREFIX
#else
#define _STATIC_PREFIX static
#endif
#undef __call_inittreesets
#undef __create_treesets
#endif

#ifdef __inittreesets
_STATIC_PREFIX void __inittreesets(_P P,_I num){
	__TSETSPACEINFO *ptsI = _getSetsInfo(P);
	__TNODE *ptn = _getSetsIndex(P); 
	_I i;
	_NodeNum(ptsI) = num;
	for (i = 1 ; i < num ;i++){
		_Inext(ptn,i) = i+1;
		_Iprec(ptn,i) = _gs_null;
	}
	_Inext(ptn,i-1) = 1;
	_NullSHead(ptsI) = i - 1;
	_DefShead(ptsI) = _VRoot;
	_DefSlen(ptsI) = 0;
	_initVRoot(ptn);
}
#undef __inittreesets
#endif


#ifdef __extend_treesets
#define __extend_sets __extend_treesets
#if (_Is_static == 0)
#undef _STATIC_PREFIX
#endif
#include "gs_setsTemp.h"
#if (_Is_static == 0)
#define _STATIC_PREFIX
#else
#define _STATIC_PREFIX static
#endif
#undef __extend_treesets
#endif



c代码无非组织数据结构复杂点,组织数据存储空间复杂点。不过这些都能解决,余下的逻辑实现,c的开发效率(不是开发后的执行效率)不输其他语言的。哈。



顶部