我是数据库设计的新手,只是想听听我是否会以合乎逻辑的方式进行设计。我正在构建一个简单的MySQL数据库,用户可以通过它将项目上传到以前存在的(不变的)层次结构树中。
举个简单的例子:
第1节
nbsp 第1.1部分
nbsp nbsp nbsp;第1.1.1小节
nbsp nbsp nbsp;第1.1.2小节
nbsp 第1.2部分
nbsp nbsp nbsp;第1.2.1小节
nbsp nbsp nbsp;第1.2.2小节
第2节
nbsp 第2.1部分
nbsp nbsp nbsp;第2.1.1小节
nbsp nbsp nbsp;第2.1.2小节
nbsp 第2.2部分
nbsp nbsp nbsp;第2.2.1小节
nbsp nbsp nbsp;第2.2.2小节
树的结构不会改变,用户只需上传细分产品(一种组织大量产品的特定行业方式)。我对邻接列表和嵌套集进行了研究,但倾向于使用3个独立的表,每个表都引用其父主键(因为树的顶层几乎永远不会改变)。当上传新产品时,它将引用其所有三个父产品(如果它是根据1.1.2小节提交的,它必然是第1节第1部分的一部分)。最终的树将有4个部分,每个部分有10个分区,每个分区有10个细分。这作为一个启动策略有意义吗?
与数据库的交互或多或少局限于输入信息并对其进行准确分类,然后能够显示一个人在部门、部门或细分中提交了多少产品。库将显示在一系列下拉列表中,单击列表项将显示存储的信息。
如有任何推荐或参考文献/教程,我们将不胜感激!
因为"树的结构不会改变",所以需要section
、division
和subdivision
表(也是产品)。
create table section (
id int primary key,
name varchar(100)
);
create table division (
id int primary key,
name varchar(100) ,
section_id int references section
);
create table subdivision (
id int primary key,
name varchar(100) ,
division_id int references division
);
create table product (
id int primary key,
name varchar(100) ,
subdivision_id int references subdivision
);
对于其他重新鉴定,例如:
- 未知深度树
- 将产品分配到多个树级别
您将寻找父子解决方案,例如:
create table tree (
id int primary key,
parent_id int null references tree,
name varchar(100)
);
create table product (
id int primary key,
name varchar(100) ,
subdivision_id int references tree
);
由于类别(部分)或多或少是静态的,您可以为每个类别分配一个"高"one_answers"低"数字,例如
catid name low high
1 Section1 1 20
2 Div1.1 2 10
3 Div1.2 11 19
4 Section2 21 40
5 Div2.1 22 29
6 Div2.2 30 39
然后有一个单独的内容表:
id catid content
1 2 fileA
2 2 fileB
3 5 fileC
要查询第1节下的所有项目,只需查询一个类别中高低值在1到20之间的所有项目。要获取Div2.1(及以下)中的所有项目,您可以查询所有类别在22到29之间的项目。这使得跟踪子类别下的项目数量变得非常容易。
我忘记了这种实际方法的名称(如果有明确的方法的话),但我已经用过很多次了。对于变化不大的结构,它比传统的parent_id-child_id类型结构更容易使用。
一个好的解决方案是使用递归表。
查看StackOverflow上的这篇文章:MySQL 中的分层数据
这样,您的设计将支持树下有更多级别。
关于这个主题的其他有趣的文章:
MySQL 中分层数据的管理
MySQL中的分层数据:父级和子级在一个查询中
MySQL中的分层数据:简单快速的
关系数据库中分层数据的无递归存储
看看嵌套集和嵌套区间:
-
http://en.wikipedia.org/wiki/Nested_set_model
-
http://en.wikipedia.org/wiki/Nested_intervals