数据库中主键和次键的最佳数据结构是什么?

3
在我的Python项目中,我有一个员工映射。键是“员工编号”,值是一个带有“员工信息”的对象,而值中的“位置”字段是“唯一”的,例如:
mapA = {12: {name: 'John Ma', location: 'US'}, 25: {name: 'Richard Yan', location: 'Eng'}, ...}

还有另一个地图,键是 location,值是另一个包含其他内容的对象。例如,

mapB = {'US': objectS1, 'Eng': objectS2, ...}

现在我想建立一个名为mapC的映射,将“员工编号”和“对象S”之间进行关联。
mapC = {12: objectS1, 25: objectS2 ...}

我必须在mapA对象中找到位置,然后获取指向该对象的键。然后使用此键和mapB中的objectS构建新的mapC。通过这种方式,时间复杂度为O(N^2)。
为了降低时间复杂度,首先我通过遍历mapA构建了一个键为“位置”、值为“员工编号”的mapD,然后可以轻松地获得mapC。
还有更好的解决方案吗?
另外,我想到了另一个问题:数据库中主键和外键的最佳数据结构是什么?
例如,这里有一张表:
| Username  | Password  | Email_Addr |
--------------------------------------
| Username1 | Password1 | Email 1    |
| Username2 | Password2 | Email 2    |
| Username3 | Password1 | Email 3    |

如果username是第一主键,Password是次要键,那么最好的数据结构是什么,以获得最佳性能?

我认为,为了简单起见,将用户名和密码合并为一个复合键。然后,我们按照以下比较函数对这些记录进行排序:

bool key_compare(string key1, string key2){
    return key1+key2 > key2+key1;
}

这些信息存储在B_tree中。

编辑2这份文件得知,这两个索引可以用哈希表倒排表实现。在上面的表格中, 哈希表保存用户名和每个记录的地址,

{用户名1:'记录1地址',用户名2:'记录2地址'} 倒排表保存密码和记录地址表的信息。

{密码1:['记录1地址','记录3地址'],密码2:['记录2地址']}

编辑1 我想了解数据库如何处理它们,例如MySQL... 除了B_tree之外还有什么哈希图?谢谢提前。


在索引列上使用类型为a_has_b的表作为复合键集合是一个不错的解决方案。 - keenthinker
它被标记为“mySQl”-- 为什么不使用SQL来执行SQL设计的任务呢?一个简单的连接似乎可以得到你想要的结果。 - James Anderson
@JamesAnderson,第一个问题不是关于SQL的,我在我的Python项目中遇到了这个问题。我只想知道SQL如何处理MySQL中的主键和次键。抱歉带来困惑。 - zangw
1个回答

0

我认为更好的解决方案是使用一个映射将ID映射到员工,并在“员工对象”中保留有关该员工的所有信息。

因此,基于您的示例,Employee将具有两个值 1. 名称 2. 位置

您的问题似乎是位置是另一个映射的键,而不是您想要获取的信息。为什么不创建一个“位置”对象来保存所有这些信息?您将能够消除第二个和第三个映射的需要。

创建一个“位置”对象,其中包含以下信息: 1. 国家 2. 纬度\经度

现在

    mapA = {12: employee1, 43: employee2, ...}

employee1具有以下信息: 姓名='John' 位置= usLocation

usLocation是location类型的对象,其中包含了所有相关信息的封装。

至于你的第二个问题,我并没有处理过SQL,所以我会让其他人来解决。


谢谢,这是个好主意。然而,在我的问题中,mapA和mapB都已经给出,我想建立“员工编号”和“objectS”之间的关系。 - zangw
哦,我没有意识到这不是实际的。你解决问题了吗? - William Gervasio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接