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

时间:2014-05-15 12:22:43

标签: mysql database algorithm data-structures

在我的python项目中,我有一张员工地图。关键是employee number,值是employee information的对象,值中的location字段是唯一,例如,

mapA = {12: {name: 'John Ma', location: 'US'}, 25: {name: 'Richard Yan', location: 'Eng'}, ...}

还有另一个地图,关键是location,而值是另一个具有其他内容的对象。比如,

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

现在我想在employee numberobjectS之间构建一个名为mapC的地图。

mapC = {12: objectS1, 25: objectS2 ...}

我必须在mapA的对象中找到该位置,然后获取指向该对象的键。然后在mapB中使用此键和objectS来构建新的mapC。这样,时间复杂度为O(N ^ 2)。

为了减少时间复杂度,首先我通过遍历mapA构建mapD,其中键为location,值为employee number,然后我可以轻松获得mapC。

这个问题有更好的解决方案吗?

BTW,另一个问题出现在我的脑海中:数据库中主键和辅助键的最佳数据结构是什么?

例如,这是一个表,

| Username  | Password  | Email_Addr |
--------------------------------------
| Username1 | Password1 | Email 1    |
| Username2 | Password2 | Email 2    |
| Username3 | Password1 | Email 3    |

username是第一个主键,Password是辅助键,存储它们以获得最佳性能的最佳数据结构是什么?

IMO,简单地说,将用户名和密码组合为一个复合键。我们根据以下比较函数对这些记录进行排序,

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

,这些信息存储在 B_tree

编辑2 我们知道,从this文档可以使用哈希表反向表来实现这两个索引。在上表中, 哈希表保存Username的信息和每条记录的地址

{Username1: 'record1 address', Username2: 'record2 address'} 倒置表保存Password和记录地址表的信息。

{Password1: ['record1 address', 'record3 address'], Password2: ['record2 address']}

修改1 我想知道数据库如何处理它们,例如,MySQL ... B_tree旁边是否有hashMap?提前谢谢。

1 个答案:

答案 0 :(得分:0)

我认为更好的解决方案是使用一个将id映射到员工的地图,并将所有关于所述员工的信息保存在'Employee对象中。

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

您的问题似乎是位置是另一张地图的关键,而不是您想要抓取的信息。为什么不拥有包含所有这些信息的“位置”对象?您将无需第二张和第三张地图。

使用以下信息创建“位置”对象: 1.国家 2.纬度\经度

所以现在

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

employee1有以下信息: name ='John' location = usLocation

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

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