2012-01-21 84 views
0

我有一个映射表,例如:怎么能一个多主键的一列被用作外键

english.Phrases (PhraseId int, WordId int, Order int) 
Primary Key Clustered (PhraseId, WordId) 

而另一个表:

english.RelatedPhrases (RelatedPhraseId int, PhraseId int) 

如何设置外国使用PhraseId的2个表之间的关键关系?

编辑回答评论哪个数据库: 我使用的是Microsoft SQL 2008,因此我更改了标记。

映射应该如下;考虑下面的语句:

1. "turn out to be", phraseId of 1 
2. "grow to be", phraseId of 2 
3. "turn into", phraseId of 3 
4. "come to be", phraseId of 4 

每个字有以下表中的条目:

english.Words (WordId int, Word varchar(20)) 

的english.Phrases表中是否有“变成是”下面的条目:

(1, @word1Id, 1) @word1Id = id of 'turn' 
(1, @word2Id, 2) @word2Id = id of 'out' 
(1, @word3Id, 3) @word3Id = id of 'to' 
(1, @word4Id, 4) @word4Id = id of 'be' 

现在,我想要从english.RelatedPhrases表中得到PhraseId为1,代表“结果是”,与其他短语相关,比如在这种情况下,2,3和4;所有相关关键词中的4个条目的RelatedPhraseId = 1。

+0

通常情况下,您不能将外键设置为(完整)主键以外的任何其他键。你使用的是哪个数据库? –

+0

那究竟是什么映射?无论wordid与所有PhraseB有关吗?重新思考你的模式 –

+0

@JoachimIsaksson IIRC根据数据库你也可以指向一个完整的唯一索引 – Luis

回答

1

如果Phrase表可以有多个具有相同PhraseID的行,则应引入一个新表。例如:

create table PhraseIds (
    PhraseId int primary key) 

create table Phrase (
    PhraseId int foreign key references PhraseIds, 
    WordId int, 
    [Order] int, 
    primary key (PhraseID, WordId)) 

create table RelatedPhrases (
    RelatedPhraseId int primary key, 
    PhraseId int foreign key references PhraseIds(PhraseID)) 
+0

虽然这并没有回答这个问题,但我决定采用这种方法,主要是因为它允许我保存每个短语的摘要数据,例如NumberOfWords&NumberOfCharacters,从而为我节省了通过连接进行聚合的成本。 –

+0

外键只能引用唯一的一组列。这个条件与主键中的列数没有关系。 – Andomar

0

您可以检查是否在触发存在记录.. 只是不要忘了性能。

相关问题