最近看到不少针对与多维数据库的技术文章。也把这方面个人的经验分享一下。
做了几年的多维数据库存储实现设计,最主要从两个方面考虑。
1.元模型
任何数据库产品的底层设计都离不开元模型,这部分不深入讨论,有兴趣的可以去OGM官网查看关于建模方法论。虽然有点晦涩,但是这个是做这个的基础。下面提供一个简单的建模思路:
Model(用于描述表对象)
Property(用于描述表字段)
OneToOne: ER 1对1
OneToMany : ER 1对多
ManyToMany: ER 多对多
ManyToOne : ER 1对多
利用上面的元模型就可以构建我们传统的数据关系了。
User(Model)
Name(Property):kind-Name,datatype-String, Length-20,name-用户名称。。。
Aeg(Property):kind-aeg , datatype-Integer, length-3, name- 年龄。。。
UserId(Property-唯一):kind-UserId, datatype-String, length-8, name - 用户ID
User与Peyment关系: ER 1对多- OneToMany
Payment(Model)
PayName(Property):kind-PayName,datatype-String, Length-20,name-工资类型名称。。。
PayType(Property-唯一):kind-PayType,datatype-String, Length-20,name-工资类型CODE。。。
amount(Property):kind-amount,datatype-decimal, Length-normal,name-工资额。。。
我们看一下多维数据表的设计实现:
这里有一个很重要的概念就是树
首先思考下面的树状结构数据
1. |─ a
2. | |─ d
3. | | └─ p
4. | | └─ q
5. | | └─ r
6. | └─ e
7. | └─ f
8. |─ b
9. | └─ x
10. | └─ y
11. | └─ z
12.└─ c
针对上面树形结构数据存储,要满足下面的需求:
1. 每个节点要可以动态增减
2. 每个节点的结构存在差异
3. 提供对这棵树所有节点的增删改查能力
要可以容纳所有的父子孙节点,他们之间的结构存在差异,提供统一的增删改查。
id | kin | parent_id | path |
1 | a | - | 1 |
8 | b | - | 8 |
12 | c | - | 12 |
2 | d | 1 | 1-2 |
6 | e | 1 | 1-6 |
7 | f | 1 | 1-7 |
9 | x | 8 | 8-9 |
10 | y | 8 | 8-10 |
11 | z | 8 | 8-11 |
3 | p | 2 | 1-2-3 |
4 | q | 2 | 1-2-4 |
5 | r | 2 | 1-2-5 |
这里面的path实际上就是对应节点到根节点的路径。
于是,在一个给定节点d的时候,
1. 查找d的所有子孙节点:Orientation_id like "d.Orientation_id%"
2. 查找某个节点的所有子节点:Orientation_id like "d.Orientation_id%"
and Parent_id=d.id
id | type | parentid | kind | Value | businessPath | metapath | |
---|---|---|---|---|---|---|---|
/User | model | root | User | - | .10010011. | ||
/name | property | /User | name | 张三 | .10010011. | /User/name | |
/age | property | /User | age | 22 | .10010011. | /User/age | |
/UserId(唯一) | property | /User | UserId | 10010011 | .10010011. | /User/UserId | |
/Payment | model | /User | Payment | - | .10010011. | /User/Payment | |
/PayName | property | /Payment | PayName | 基本工资 | .10010011.01. | /User/Payment/PayName | |
/PayType(唯一) | property | /Payment | PayType | 01 | .10010011.01. | /User/Payment/PayType | |
/amount | property | /amount | amount | 5,000 | .10010011.01. | /User/Payment/amount | |
下面可以追加其他工资类型的数据以及其他员工的数据 | |||||||
对于该表的增删改查,实现思路有别与传统思路,需要借助path列BisinessPath列以及其他辅助字段组合。有兴趣的可以自己研究一下。
微信号:chljapan 附注:多维数据库实践
转载请注明出处,原创不容易。