需要外键数据库帮助

时间:2014-05-19 04:51:17

标签: sql database subquery

我不确定如何标题我的问题,但情况就是这样。

我有三个SQL表如下:

One Lookup表,其中列出了形容词的名称以及与每个形容词相关联的数字(主键值)。

一个Object表连接到我需要帮助的情况之外的其他表。

和一个将对象表连接到形容词查找表的表。连接表有三个外键。一个连接到查找表的主键,另一个连接到Object表中的引用键。

如果我想为冗余数据库条目浪费磁盘空间,我不会在这里寻求帮助,因为我会做的就是这样的事情:

在查找表中,假设我有以下几行值:

1,"sweet"
2,"bitter"
3,"sour"

在Object表中,我有一个表示对象的主键,对象名称的字段和表示对象的所有形容词的引用键。现在,我们假设它只有两行具有这些值:第1行:(主键1," Raspberry",参考键值1),第2行:(主键2," Strawberry& #34;,参考键值4)。

让我们说我的第一步是制作一种苦涩的甜味"。 ![在此处输入图像说明] [1] 然后在我的连接表(将对象连接到形容词)中,我有一个字段是常量值(对于对象)而另一个字段是单个值,我放入(1,1)和(1,2)来应用两个& #34;苦"并且"甜蜜"覆盆子。

让我们说我想做一个草莓"苦甜"同样。

然后在我的连接表中,我输入(4,1)和(4,2)来同时应用"苦涩"并且"甜蜜"草莓。

这里的问题是连接表中的第一个字段值,因为值1和4表示"苦甜"。它们需要被浓缩,所以我可以使用1或4.

我试图找出一种简单的方法来实现整个过程的自动化。此外,我希望能够优先考虑每个单词。例如,我想决定形容词的使用顺序。

到目前为止,我已经提出了这个未经考验的想法:

select keytoobject 
from connectingtable 
where keytoobject  in (select keytoobject 
                       from connectingtable 
                       where keytoadjective=1) 
  and keytoobject in (select keytoobject 
                      from connectingtable 
                      where keytoadjective=2) 
group by keytoobject 
having count(*) = 2

基本上,我尝试做的是搜索连接表以查看是否已经存在完全相同的形容词集,如果确实存在,则接受该键并重新使用它而不是使用相同的新密钥形容词。

另外,让我感到困惑的是,当我选择形容词时,我也希望保留它们的优先权。

有没有人对我如何解决这个问题有更好的了解?

更新:我添加了显示正在发生的事情的表格。由于我的声誉不到10,我不得不发布图片链接。我希望我把它们贴好。

Database i need help with ERD for same database

我刚才意识到我正在寻找的这个词是规范化。我想规范化连接表。

在示例中(基于图像),我希望这些单词存储在数据库中: 苦甜覆盆子 苦甜草莓 超级疯狂酸糖果 疯狂的甜糖(对不起,我的意思是让左下角的AID值为4而不是2) 甜食。

对于苦甜的覆盆子和苦甜的草莓,我可以通过交换CID为33时的优先值将其改为甜苦的覆盆子和甜苦草莓。

我希望我的软件能够做到这一点:

首先它要求我输入对象的名称。接下来,它存储对象名称,并为对象表中的对象创建随机ID

接下来它要求我选择适用于该对象的所有形容词。说我选择其中三个。然后我给每个形容词一个优先级编号,以便计算机知道它们进入哪个顺序供以后使用。 (让我们称这个为对象"疯狂的苦甜草莓")

完成后,软件将在连接表中创建3行值,以将该组形容词应用于对象。 (1为疯狂,1为苦,1为甜)

说我想添加一个新对象。它与新ID一起存储在objects表中。现在这次我想使用之前使用的两个形容词,但我想避免在可能的情况下创建额外的数据行。 (让我们称之为"苦甜的覆盆子")

然后对于第三个对象,我添加了四个形容词,但一个与另一个对象中的形容词相匹配。 (让我们称之为"可笑的超级疯狂的女孩")

然后说我想添加50个带有一些形容词的对象,但其中一个是"疯狂",另外50个带有一些形容词,但一个形容词是" sweet"

这里的问题是我的电脑会为这个单词生成额外的50行"疯狂"这个单词额外有50行" sweet"。不知何故,我希望系统重用现有的 形容词如果匹配的话。

基本上,系统是一个构建单词的应用程序,人们可以在其中添加和删除形容词。

如果可能的话,我想避免使用大型数据库。我感觉大型数据库的唯一方法是在所有情况下使用的每个形容词都是一个独特的单词。

有些东西告诉我,我需要另一张桌子,但我不知道我是不是。

哦,作为参考,AID代表形容词ID号,CID代表连接表ID。同样对于表格,一个对象可以拥有尽可能多的形容词,并且一组形容词可以应用于任意数量的对象。

1 个答案:

答案 0 :(得分:0)

您最好不要更改 2 更多的表来维护您的形容词"群组"而不是更改您的对象表格。

但这假设经常重复使用相同的形容词组(和优先级)。您可能会发现原始数据库结构更适合,因为额外的连接可能会降低性能。

我已经在SQL Server的tsql中编写了它,因为您还没有标记您正在使用的数据库。

CREATE TABLE [Objects]
(
    ID INT IDENTITY(1,1) PRIMARY KEY,
    Name VARCHAR(255) NOT NULL UNIQUE
);

CREATE TABLE [Adjectives]
(
    ID INT IDENTITY(1,1) PRIMARY KEY,
    Name VARCHAR(255) NOT NULL UNIQUE
);

CREATE TABLE [AdjectiveGroup]
(
    GroupID INT IDENTITY(1,1) PRIMARY KEY
);

CREATE TABLE [AdjectiveGroupDetail]
(
    GroupID INT NOT NULL REFERENCES [AdjectiveGroup] (GroupID),
    AID INT NOT NULL REFERENCES [Adjectives] ([ID]),
    [Priority] INT NOT NULL,
    UNIQUE (GroupID, AID),
    UNIQUE (GroupID, [Priority])
);

CREATE TABLE [ConnectingTable]
(
    CID INT NOT NULL REFERENCES [Objects] ([ID]),
    GroupID INT NOT NULL REFERENCES [AdjectiveGroup] (GroupID),
    UNIQUE (GroupID, CID)
);

SET IDENTITY_INSERT [Objects] ON;
INSERT INTO [Objects] ([ID], [Name]) VALUES (1, 'Raspberry'), (2, 'Strawberry');
SET IDENTITY_INSERT [Objects] OFF;
SET IDENTITY_INSERT [Adjectives] ON;
INSERT INTO [Adjectives] ([ID], [Name]) VALUES (1, 'Sweet'), (2, 'Bitter');
SET IDENTITY_INSERT [Adjectives] OFF;
SET IDENTITY_INSERT [AdjectiveGroup] ON;
INSERT INTO [AdjectiveGroup] (GroupID) VALUES (1);
SET IDENTITY_INSERT [AdjectiveGroup] OFF;
INSERT INTO [AdjectiveGroupDetail] (GroupID, AID, [Priority]) VALUES (1, 1, 2), (1,2,1);
INSERT INTO [ConnectingTable] (CID, GroupID) VALUES (1, 1), (2, 1);