我有一张名为投资者的表,其主键为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?我的意思是,我是否需要在所有列的投资者表中创建外键?
答案 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
然后在代码中处理结果。你可以以编程方式处理上面的组合查询,但它有点复杂。