首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于可变客户细分数的数据库主键

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

Stack Overflow用户
提问于 2013-10-28 18:43:46
回答 2查看 112关注 0票数 0

使用MySQL DB在Groovy/Grails和GORM中执行此操作。

当我们为不同的客户存储数据时,我们需要能够识别他们的细分。有些将有0级的细分。一些,1,2,3,级别等,我们希望允许任何级别的细分,但可以满足一个固定的数字,如5,7或10。

例如:

ABC公司有两个细分级别:

(公司) ABC (根级) ABC->Div1 1,ABC->Div1 2,ABC->Div1 3细分级2) ABC->Div1 1->SubDiv1 1,ABC->Div1 1->SubDiv1 2,ABC->Div1 1->SubDiv1 3

DEF公司有1级:

DEF->Div3 1,DEF ->Div3 2,DEF->Div3 3

我们需要为每个级别定义1到1和1到许多唯一属性(例如,将一个地址与ABC->Div1 1->SubDiv3 3相关联)

ABC公司可能希望我们为Div2和Div2 2的所有细分显示一个特定的图像。

问题是,如何最好地为标识符或主键创建一个可变的划分级别,然后将其用作相关数据上的外键?

有固定数量的列(如7列和复杂键):

ID-级别-1,ID-级别-2,ID-级别-3,ID-级别-4,ID-级别-5,ID-级别-6,ID-级别-7

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-29 02:04:01

您可以将其建模如下

代码语言:javascript
复制
class Company {
    static hasMany = [subdivisions: Subdivision]
}

class Subdivision {
    static belongsTo = [company: Company, subdivision: Subdivision]
    static hasMany = [subdivisions: Subdivision]
}
票数 0
EN

Stack Overflow用户

发布于 2013-10-28 20:40:30

存储它就像您描述的那样: Company->Div->Subdiv:

代码语言:javascript
复制
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 1->SubDiv3 3联系起来:

代码语言:javascript
复制
CREATE TABLE addresses (id ... , subdivision_id INTEGER, ...);
ALTER TABLE addresses ADD CONSTRAINT fk_addresses_subdivisions FOREIGN KEY (subdivision_id) REFERENCES subdivisions (id);

..。查询Div2和Div2 2的所有子分区的所有实例。

代码语言:javascript
复制
SELECT * FROM subdivisions WHERE subdivision_path LIKE 'ABC->Div2%';

..。对于Div2的所有分支:

代码语言:javascript
复制
SELECT * FROM subdivisions WHERE subdivision_path LIKE 'ABC->Div2->%';

..。对于所有根公司:

代码语言:javascript
复制
SELECT * FROM subdivisions WHERE level = 0;

..。还有更多。

或者,subdivision_path可以存储it,而不是名称(也许更好)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19642656

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档