使用MySQL DB在Groovy / Grails和GORM中执行此操作。
在为不同客户存储数据时,我们需要能够识别其细分。有些将具有0级别的细分。一些,1,2,3等级等我们希望允许任意数量的细分,但可以适用于固定数字,例如5,7或10。
例如:
ABC公司有2个细分级别:
公司)ABC(根级) 细分级别1)ABC-> Div1,ABC-> Div2,ABC-> Div3 细分级别2)ABC-> Div1-> SubDiv1,ABC-> Div1-> SubDiv2,ABC-> Div1-> SubDiv3
公司DEF有1个级别:
公司)DEF(根级别) 等级1)DEF-> Div1,DEF-> Div2,DEF-> Div3
我们需要为每个级别定义1到1和1到多个唯一属性(例如,将地址与ABC关联 - > Div1-> SubDiv3)
ABC公司可能希望我们为Div2和Div2的所有细分显示特定图像。
问题是,如何为标识符或主键创建可变数量的分区级别,然后将其用作相关数据的外键?
具有固定数量的列(如7和复杂键):
ID-Level-1,ID-Level-2,ID-Level-3,ID-Level-4,ID-Level-5,ID-Level-6,ID-Level-7
或者,创建某种层次结构树并使用各种键值作为标识符/外键?
答案 0 :(得分:0)
按照您描述的方式存储它:公司 - > Div-> Subdiv:
id subdivision_name subdivision_level subdivision_path
-----------------------------------------------------------------
1 ABC 0 ABC
2 Div1 1 ABC->Div1
3 Div2 1 ABC->Div2
4 Div3 1 ABC->Div3
5 SubDiv1 2 ABC->Div1->SubDiv1
6 SubDiv2 2 ABC->Div1->SubDiv2
7 SubDiv3 2 ABC->Div1->SubDiv3
8 DEF 0 DEF
9 Div1 1 DEF->Div1
10 Div2 1 DEF->Div2
11 Div3 1 DEF->Div3
级别数仅受subdivision_path长度的限制 - 标准数据类型应该足够。
所以让我们将地址与ABC-> Div1-> SubDiv3相关联:
CREATE TABLE addresses (id ... , subdivision_id INTEGER, ...);
ALTER TABLE addresses ADD CONSTRAINT fk_addresses_subdivisions FOREIGN KEY (subdivision_id) REFERENCES subdivisions (id);
...查询Div2和Div2所有细分的所有实例。
SELECT * FROM subdivisions WHERE subdivision_path LIKE 'ABC->Div2%';
...对于Div2的所有细分:
SELECT * FROM subdivisions WHERE subdivision_path LIKE 'ABC->Div2->%';
...适用于所有根公司:
SELECT * FROM subdivisions WHERE level = 0;
......等等。
或者,subdivision_path可以存储id,而不是名称(可能更好)。
答案 1 :(得分:0)
您可以像以下
那样建模class Company {
static hasMany = [subdivisions: Subdivision]
}
class Subdivision {
static belongsTo = [company: Company, subdivision: Subdivision]
static hasMany = [subdivisions: Subdivision]
}