是否真的有必要在此查询中创建外键?

时间:2015-07-26 21:29:17

标签: mysql join foreign-keys entity-relationship

我有一张名为投资者的表,其主键为private async void EncryptFile_Click(object sender, RoutedEventArgs e) { if (String.IsNullOrEmpty(filePathTextBox.Text) || String.IsNullOrEmpty(SaveLocationTextBox.Text)) { MessageDialog msgDialog = new MessageDialog("Please select a file AND a save location", ""); await msgDialog.ShowAsync(); } else { string format = "C:\\Users\\MyName\\"; string fileName = fileNameTextBox.Text; string savePath = Path.Combine(format, folderPathTextBox.Text, fileName); //encryption SharpAESCrypt.SharpAESCrypt.Encrypt("password", filePathTextBox.Text, savePath); EncryptStatus.Text = "File Sucessfully Encrypted"; } } 。我还有一些名为Users Login_Logs和Accounts的表。所有这些表都包含外键investor_id。在投资者和用户之间,我们有一对一的关系。在投资者和登录之间记录一对多的关系,以及投资者和记录一对多的关系。我的问题是为了创建一个查询来加载表Users,Login_Logs和Accounts中包含的信息 - 我是否需要在投资者表中存储Users id,Accounts id和Login_Logs id?我的意思是,我是否需要在所有列的投资者表中创建外键?

1 个答案:

答案 0 :(得分:1)

不,外键约束不会影响联接和读取查询。它们确保子列中的值存在于引用的列中。它们用于完整性,而不是用于链接行或表。

AFAICT在您的投资者表中记录用户ID是多余的,并且在投资者中记录帐户和login_log ID是不切实际的。

为了能够有效地加入表,您需要的是索引每个表中的investor_id。然后,由您的查询根据需要连接表。

同时检索投资者所有信息的问题在于您有(多个)一对多关系。如果我们加入所有表格:

if user
    file = share.Files.findOne({_id: @params._id, accessibleBy: user._id})
    if file
      location = "/server/file/" + file._id + "/" + file.policy + "/" + file.signature
      @response.writeHead(301, {Location: location})
  @response.end()

然后,如果投资者有2个账户和2个login_logs,那么我们将获得4行。 SQL数据库无法嵌套相关数据。相反,您可能必须使用3个查询来检索有关投资者的所有信息:

SELECT *
FROM investors i
JOIN users u ON i.ID = u.investor_id
JOIN accounts a ON i.ID = a.investor_id
JOIN login_logs l ON i.ID = l.investor_id

然后在代码中处理结果。你可以以编程方式处理上面的组合查询,但它有点复杂。