地址簿搜索 - 大数据时我应该使用哪种数据结构

时间:2015-12-08 04:28:30

标签: java design-patterns database-design

我想用以下字段设计地址簿

UID名称PhoneNumber1 PhoneNumber2

UID是唯一标识名称。让我们说我想节省200万条记录。 现在我想构建如何保存这些记录,以便可以通过Name和phoneNumber进行搜索。

我应该使用哪种数据结构和搜索技术。

提前致谢

3 个答案:

答案 0 :(得分:1)

如果您的姓名有冲突怎么办? 约翰史密斯可以多次返回。 您最好只使用PhoneNumber1 / PhoneNumber2作为搜索变量。

我建议HashTable执行此操作,因为它允许O(1)进行搜索,并且有200万条记录,您不希望它永远找到某人。

答案 1 :(得分:1)

将其标准化为以下表格和列:

  • 名称UID, Name
  • PhoneNumbers UID, SN, PhoneNumber
    • SN序列号,所以1或2(以及将来,3到1000)

您执行的每次搜索都应运行两个查询,每个表一个(或两个表上的一个UNION查询)

SELECT   UID, Name
FROM     Names
WHERE    Name = '%<search string>%'

SELECT   UID, PhoneNumber
FROM     PhoneNumbers
WHERE    PhoneNumber = '%<search string>%'
ORDER BY UID  # so that multiple matches with same user appear together

结合两个查询的结果可以用Java完成。

答案 2 :(得分:1)

为什么不设计课程AddressBook

class AddressBook{
private Integer uuid;
private String name;
private Integer phoneNumber1;
private Integer phoneNumber2;

//getters & setters 

}

使用相应的字段在数据库中创建AddressBook表。 uuid将成为主键。保留AddressBook对象。

按名称搜寻

select * from AddressBook where name ="something";

按电话号码搜寻

select * from AddressBook where phoneNumber1="something";