数据库主键基于可变数量的客户细分

时间:2013-10-28 18:43:46

标签: mysql sql grails database-design gorm

使用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

或者,创建某种层次结构树并使用各种键值作为标识符/外键?

2 个答案:

答案 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]
}