使用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
或者,创建某种层次层次的树,并使用各种键值作为标识符/外键?
发布于 2013-10-29 02:04:01
您可以将其建模如下
class Company {
static hasMany = [subdivisions: Subdivision]
}
class Subdivision {
static belongsTo = [company: Company, subdivision: Subdivision]
static hasMany = [subdivisions: Subdivision]
}发布于 2013-10-28 20:40:30
存储它就像您描述的那样: Company->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 1->SubDiv3 3联系起来:
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的所有子分区的所有实例。
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可以存储it,而不是名称(也许更好)。
https://stackoverflow.com/questions/19642656
复制相似问题