我想在特定问题上提供一些数据库/编程建议。
我有5个不同的人(生活在世界不同的地方)为我提供数据。根据标准结构布局,这些数据以多种方式提供给我。然而,它并不总是协调一致,数据可能有额外的东西不符合标准,所以我希望结构尽可能动态,以适应人们想要使用的东西。
然后将这5个数据源放在我托管的中央数据库中。所以基本上我有5个数据源按照标准结构格式化,并且它们被上传到我的本地数据库。
我想尽可能为提供数据的人自动上传这些数据,所以我希望他们上传自动插入我本地数据库的新数据集。
我的问题是:
答案 0 :(得分:3)
如何保持结构动态,而不必重新审视我的标准布局以适应新的数据字段或不同的结构?
基本上,您可以转动列和行的正常数据库概念。
您有一个数据名称表,其中包含数据字段的唯一名称,以及一个指示器,用于告知导入过程存储的数据类型,如日期,时间戳或整数。
您有一个数据表,其中包含数据名称ID,序列号,数据字段和识别信息的外键。
序列号用于区分相同数据名称的不同值。
数据字段可以保存每种类型的数据。在大多数数据库中,这将是VARCHAR(MAX)。由上传过程将日期和数字转换为字符串。
您的数据表将包含识别数据字段所属人员的其他信息的外键。
如何让他们以增量方式上传数据?例如,他们可能正在上传他们数据的XML版本,我的上传代码应该找出已经存在的内容。
简短的回答是,你不能。
您的上传过程必须识别重复数据,而不是将其存储在数据库中。
我最后也是最重要的问题。是否有更好的方法来实现这一目标而不是上传基础设施?
这是一个难以回答的问题,在不了解更多关于您正在接收的数据类型的情况下,但是有一些软件允许您在没有大量编程的情况下加载数据库,方法是定义输入数据结构并将该结构映射到你的数据库表。
答案 1 :(得分:1)
这是一个非常普遍的问题,但我认为我有一个普遍的答案。我认为解决您的问题的方法是构建一个新的关系演算,其中附加到主记录的属性不是预先确定的。以下是涉及电话簿应用程序的示例。
使用非关系表的常用方法:
一切都很好,但如果偶尔出现一部手机,一部手机,一部传真电话等,你会怎么做?
相反,你所做的是:
Person和Phones之间存在一对多的关系,并且可以有从0到数万的任意数量的关系。这些表由Person_ID加入。您必须具有枚举Phone_Type列的业务和表示逻辑(或者只是让它成为自由格式,这不是那么有用但更容易)。
您可以为任何属性执行此操作,并且是关系数据库的全部内容。我希望这会有所帮助。
答案 2 :(得分:0)
正如其他人所说,EAV表可以处理动态结构。 (注意大表的性能问题)
但是,您的数据库字段由客户端决定是否符合您的利益?你不能编写业务逻辑来对这些新领域采取行动,因为它们还不存在,它们可能是任何东西。
您可以强制客户符合您的型号吗?这允许您提前了解字段并使业务逻辑对字段起作用。它还允许您编写有意义的报告,而不仅仅是轮转数据转储。