首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >相同字段但内容不同

相同字段但内容不同
EN

Database Administration用户
提问于 2012-05-18 05:21:50
回答 1查看 122关注 0票数 1

我在为占卜系统建立一个数据库。为了方便起见,我会用“我清”来解释。

六边形的每个元素都是不同的表。有一个代表阴阳,一个代表三个位置,一个代表三位一体,一个代表六边形。还有一个对应表,它与其他表格相连--阴阳对应,三个位置对应,三位一体,六边形。还有一个带有评注的表格,它还链接到其他每个表格(对应表除外)。

因此,例如,用于三叉图的表的结构可能如下:

代码语言:javascript
复制
TriID     
TriName    
Line1                    -FK (YinYangID)
Line2                    -FK (YinYangID)
Line3                    -FK (YinYangID)
TrigramMeaning
Correspondence           -FK (CorrespondencesID)
Commentary               -FK (CommentariesID)

数据如下:

代码语言:javascript
复制
 TriID  TriName Line1 Line2 Line3 TriMeaning Correspondence  Commentary
 1      Qian    Yin   Yin   Yin   Receptive  1               1
 2      Kun     Yang  Yang  Yang  Generation 2               2

这张对应表看上去像这样

代码语言:javascript
复制
 CorrID    Person    Season     Color     Animal    Number     Element
 1         Father    Winter     Blue      Bear      3          Metal
 2         Mother    Summer     Red       Deer      6          Earth

(我知道我所有的易经数据都错了.)

其思想是,每个表都需要相同的对应关系,因此对应表将对其他每个表都有一个条目。CorrespondencesID 1到4可能适用于YinYang表,例如(老阴和新阴、老阳和新阳),然后5到13适用于每个trigram,等等。

看来这会很好用。另一方面,直觉地感觉我做错了什么,违反了一些规则。由于对应表上的每个条目都不同,似乎每个表上都应该有类似的条目:

代码语言:javascript
复制
TrigramPerson
TrigramSeason
TrigramColor
TrigramAnimal

然后

代码语言:javascript
复制
HexagramPerson
HexagramSeason
HexagramColor

诸若此类。

构建数据库的智能/最佳方法是什么?很抱歉,如果这是一个愚蠢的问题--我对数据库设计还不熟悉,其中一些概念仍然把我搞糊涂了。

EN

回答 1

Database Administration用户

发布于 2013-02-06 07:25:40

我不得不再读几遍你的问题,才能明白你想做什么。我建议的是一个基于类的多连接。在一些数据库(如PostgreSQL )中,您可以对联接进行一些高级的引用完整性检查,但这不在我的回答范围之内。

假设您有一张桌子:

代码语言:javascript
复制
CREATE TABLE correspondence_class (
     id int not null unique, -- hand-assigned
     label text primary key, -- hand-assigned, don't want duplicate labels
);

然后我们就可以:

代码语言:javascript
复制
INSERT INTO correspondence_class (id, label) 
VALUES ('1', 'person'), (2, 'color'), (3, 'season'), -- and so forth

从那里我们可以有另外两张桌子:

代码语言:javascript
复制
CREATE TABLE trigram_assoc (
   trigram_id int references trigram(id),
   c_class_id int references correspondence_class(id),
   correspondence text not null,
   PRIMARY KEY (trigram_id, c_class_id)
 );

在PostgreSQL中,您也可以更改主键以包含通信,并且只对附加到某些通信类的通信进行唯一索引。您还可以使用可推迟的约束触发器来确保所有相关的关联都被填充,但是如何在其他dbs上准确地实现这一点是一个很好的问题。

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

https://dba.stackexchange.com/questions/18146

复制
相关文章

相似问题

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