SQL中的多对多层次结构关系

时间:2018-01-19 01:17:17

标签: sql database hierarchical-data

我正在试图弄清楚如何在数据库中存储分层数据,但我遇到了麻烦,因为数据似乎不适合简​​单的树层次结构。我正在研究市场指数和子指数,它们可以通过多种不同的方式分为多个不同的水平。我将尝试用一个简单的例子来解释。

假设我们有一个代表整个世界(世界)的指数,而且只有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 |
|-------------------|---|

世界指数可分为美国和中国,但也可分为技术和医疗保健。此外,美国指数可分为美国科技和美国医疗保健,而美国医疗保健也是医疗保健的一部分(与中国医疗保健一起)。

我希望能够检索各种不同的分组索引方法。以下是一些例子:

  • 按国家分组:{1:[2,3]}
  • 按行业分组:{1:[4,5]}
  • 按国家划分,部门:{1:[2:[6,7],3:[8,9]]}
  • 按行业分组,国家:{1:[4:[​​6,8],5:[7,9]]}

关于如何在关系表中表示这一点的任何建议?

1 个答案:

答案 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));