0

我正在考虑创建以下 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

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

我的问题是可以有 2 个非唯一字段作为外键吗?

另外,如果我只是将 SessionId 自己设置为(FK),并且如果 QuestionNo 允许(FK),那是根据自己的问题设置的,因为有多个会话相同QuestionNo,如果我点击QuestionNo上面的一个,它可以QuestionNo在包含该的所有会话中显示相同的行QuestionNo

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

4

2 回答 2

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 条目被删除。

至于您的问题,如果外键仍然可以引用非唯一列,答案是肯定的。

于 2013-01-16T03:24:44.017 回答
0

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

于 2013-01-16T03:29:24.440 回答