Database design 在数据库中存储个人联系人的格式

Database design 在数据库中存储个人联系人的格式,database-design,contacts,Database Design,Contacts,我正在考虑在商业应用程序的数据库中存储个人联系人的最佳方法。传统且简单的方法是创建一个表,其中包含每个元素的列,即姓名、电话号码、职务、地址等。。。然而,对于这类数据有一些已知的行业标准,例如,or,甚至XML模式。使用标准格式会带来一些好处,比如与其他系统的互操作性。但我如何决定使用哪种方法呢 需求主要是存储数据。搜索和排序查询不太可能,但可能。数据量最多为100000条记录 我的数据库引擎支持原生XML列。我一直在考虑使用一些基于XML的格式来存储个人联系人。然后,如果需要搜索和排序,就可以

我正在考虑在商业应用程序的数据库中存储个人联系人的最佳方法。传统且简单的方法是创建一个表,其中包含每个元素的列,即姓名、电话号码、职务、地址等。。。然而,对于这类数据有一些已知的行业标准,例如,or,甚至XML模式。使用标准格式会带来一些好处,比如与其他系统的互操作性。但我如何决定使用哪种方法呢

需求主要是存储数据。搜索和排序查询不太可能,但可能。数据量最多为100000条记录

我的数据库引擎支持原生XML列。我一直在考虑使用一些基于XML的格式来存储个人联系人。然后,如果需要搜索和排序,就可以对这些数据使用XML索引。这是一个好方法吗?对此,您建议使用哪种联系人格式和模式

在第一次回答后编辑

这就是为什么我认为直截了当的方法是不好的。这是由于这类数据的性质——并不是那么简单

  • 个人联系人的数据结构不好,可以称之为半结构化数据。每个联系人可能有不同的数据字段,甚至可能是我无法预料的字段。在我看来,这些数据的每一部分都应该被视为重要信息,即不能因为数据库中没有相关列而丢弃任何数据
  • 如果我们更进一步,假设没有数据丢失,那么我们可以创建一个名为Comment或Description或Other的大文本列,并将所有不能很好地放入表列中的内容放在那里。但话说回来,数据将失去结构,这可能是不好的
  • 如果我们需要结构化数据,那么根据数据库设计原则,应该将数据分解为实体,并在实体之间建立关系。但这增加了复杂性-实体太多,需要做出很多设计决策,比如“我们如何存储地址?个人姓名?电话号码?我们如何编码家庭电话号码和手机号码?其他联系信息如何?”实体之间的关系复杂多样,每个关系都是数据库中的一个表。每个关系都需要记录在设计文件中。那是很多工作要做。但完全可以避免这种复杂性——只需记录数据是根据这样或那样的标准模式存储的,即周期。那么,任何阅读该文件的人都应该很容易理解它的全部内容
  • 最后,这都是关于使用行业标准的。希望这个标准是由一些聪明的人设计的,他们对个人联系信息的结构进行了比我更好的预测和描述。为什么我们都要重新发明轮子??使用标准模式要容易得多。问题是,标准太多了——决定使用哪种标准并不容易
    看起来您没有任何实际的性能或空间问题。因此,尽可能少地使用代码和维护


    您可能希望允许将数据导出为vCard/hCard等格式,但不要将其用作应用程序的存储后端,除非您认为这样会减少总体编码/维护。

    正常数据库方法有什么问题。就像你提到的——有几种不同的格式,如果你实现了一种,那么你就破坏了与其他系统的兼容性。
    使用数据库方法,您以后可以为链接外部应用程序所需的每种格式编写插件—VCard或其他格式。

    您提到的格式是系统间交换数据的好方法,但不适合存储在数据库中。不要让数据交换标准支配数据库设计。无论使用何种数据库设计,您都可以创建一个服务或程序,以XML格式公开数据供外部使用。

    我可能会为“正常”数据位(姓名、地址、电话等)设置一个“正常”表结构,然后与一个单独的表“自定义字段”建立一个“一->多”关系其中包含三列:

    用户id(外部ey)、字段类型(字符串)、数据(字符串/blob)

    或者,您可以在主联系人表中添加一个blob或文本字段,其中包含自定义字段/值映射的格式化列表(您可以使用BSON、JSON或YAML来简化操作)。然后,当用户打开联系人时,只需解压缩数据即可

    如果您需要更快的性能和按自定义字段轻松排序联系人的能力,您可能希望查看以文档为中心的数据库后端,如MongoDB,或者甚至搜索引擎本身(SOLR或Google..idk..)可能有些过分,但也可能是一个有趣的项目


    有很多很多种方法可以将自定义字段和值与“普通”数据库中的条目相关联。只要选一个你能理解并且能写得很快的就可以了。我从未见过一家公司/雇主关心后端数据存储系统的“标准遵从性”。。只要您编写某种导出脚本,或(如前所述)编写插件以支持无缝VCARD/XML导入/导出,您就可以声称您的应用程序“符合标准”。

    但我的数据库设计应该由什么决定呢?我想避免这种情况complexity@Gart对于关系数据库设计,Boyce Codd/5th范式通常是一个很好的起点。如果您正在寻找模板示例,那么请看一看:当然,正常表单是关系数据库设计的关键——但是很抱歉,我不能接受您的解决方案。您给出的示例是2002年的,当时没有合适的技术和标准。这种做法可能是错误的