我正在试图弄清楚如何在数据库中存储分层数据,但我遇到了麻烦,因为数据似乎不适合简单的树层次结构。我正在研究市场指数和子指数,它们可以通过多种不同的方式分为多个不同的水平。我将尝试用一个简单的例子来解释。
假设我们有一个代表整个世界(世界)的指数,而且只有2个国家(美国和中国)。此外,股票可以分为两种类型(技术和医疗保健)。这将留下以下9个指数:
|-------------------|---|
|Index |ID |
|-------------------|---|
| World | 1 |
| USA | 2 |
| China | 3 |
| Technology | 4 |
| Health Care | 5 |
| USA Technology | 6 |
| USA Health Care | 7 |
| China Technology | 8 |
| China Health Care | 9 |
|-------------------|---|
世界指数可分为美国和中国,但也可分为技术和医疗保健。此外,美国指数可分为美国科技和美国医疗保健,而美国医疗保健也是医疗保健的一部分(与中国医疗保健一起)。
我希望能够检索各种不同的分组索引方法。以下是一些例子:
关于如何在关系表中表示这一点的任何建议?
答案 0 :(得分:0)
如果您只是想存储和检查索引/子索引,国家/地区和行业关系,那么一个解决方案涉及五个表:索引表,扇区表,扇区索引连接表,国家/地区表,以及country-index连接表。索引表可以保存对任何父索引的引用(自联接)。这种模式显然会对您需要确认的基数做出一些假设。 sqlfiddle
create table indices (indexid int not null primary key, name nvarchar(100), parentIndex int null,
foreign key (parentindex) references indices(indexid));
create table sectors (sectorid int not null primary key, name nvarchar(200));
create table countries (countryid int not null primary key, name nvarchar(200));
create table indices_join_sectors (sectorid int not null, indexid int not null,
foreign key (sectorid) references sectors(sectorid),
foreign key (indexid) references indices(indexid));
create table indices_join_countries (countryid int not null, indexid int not null,
foreign key (countryid) references countries(countryid),
foreign key (indexid) references indices(indexid));