如果两个字段都不唯一,是否可以创建外键?

时间:2013-01-16 01:24:44

标签: mysql sql mysqli

下面我有2个数据库表我正在考虑创建:

问题表:

QuestionId(PK)  QuestionNo  QuestionContent  SessionId (FK)
11              1           Question1        3    
12              2           Question2        3
13              3           Question3        3

Image_Question

ImageId (PK)  SessionId (Fk)  QuestionNo (FK)
1              3               1
2              3               2

由于我设置图像上传的方式,用户可以在将问题提交到db之前将图像上传到问题,因此只能确定图像属于我的html中的哪个问题就是使用QuestionNo html知道哪个问题上传了图像文件,因为在提交页面之前不会输入QuestionId。

我的问题是,是否可以将2个非唯一字段作为外键?

此外,如果我只是将SessionId设置为(FK)并且如果QuestionNo允许(FK),那么就设置在它自己的prblem上,因为有多个会话具有相同的QuestionNo,如果我点击上面的QuestionNo,它可以在包含QuestionNo的所有会话中显示相同QuestionNo的行。

我的另一个问题是如何合并SessionIdQuestionNo(FK),这样如果我在QuestionNo下搜索,它会在相关QuestionNo中搜索SessionId {1}}?如果我点击SessionId,则会显示SessionId的详细信息,这样就可以了。

2 个答案:

答案 0 :(得分:0)

我觉得你的问题有点难以理解,但从我可以收集的内容来看,你使用QuestionNo作为临时令牌将多个http请求链接在一起(图片上传+问题帖子)。

我建议像:

SessionQuestionToken
{
  Token
  SessionId
}

Image
{
  ID
  QuestionId FK references Question(Id)
  ImageName
}

Question
{
  Id
  Content
}

TempImage
{
  Token FK references SessionQuestionToken(token)
  ImageName
}

这样的逻辑:

  1. 用户请求问题表单。服务器设置令牌并包含以响应用户。
  2. 用户上传包含令牌的图片。图像存储在临时表中。
  3. 第2步重复n次。
  4. 如果用户使用令牌值提交问题,则会在问题表中放置一个条目并分配一个ID。 TempImage表中共享令牌的所有图像都使用现在已知的QuestionId插入到图像表中。然后删除SessionQuestionToken条目,级联删除TempImage中的临时图像。
  5. 其他用户不提交问题,然后删除文件并删除SessionQuestionToken条目。
  6. 至于你的问题,如果外键仍然可以引用非唯一列,答案是肯定的。

答案 1 :(得分:0)

您可以在表格中引用多个外键。只需确保您的主键是唯一的。