我正在建立一个监控设备的数据库,但我已陷入僵局。
我有40种不同类型的设备,每种设备都记录不同的信息并且有一些共同的(例如设备名称,采样日期),但主要是不同的属性(例如signal_50_100Hz,device_arm_attached)。
我认为,有两种选择:
构建一个包含并耗尽所有设备所有属性的大表。
为每种设备类型创建一个单独的表,在每个表中分别列出每个属性。
此数据库的目的是将来自这些监视设备的信息不断聚合到一个视图中,然后根据分析人员的需求进行查询。
我喜欢为每个设备创建一个不同的表,然后使用一个公共视图将这些表中的相关数据聚合成一个更实用和更常见的形式。这将允许我保留数据(为了保留),并根据需要从一个通用的抽象层,一个大视图聚合它。
您认为这种方法存在任何问题吗? 哪种方法更有意义? 我可以采用哪些其他策略? 有没有人对如何更好地解决这个问题有任何一般性建议?
答案 0 :(得分:0)
在大多数情况下,如果添加新设备并且它具有新属性,并且您打算让应用程序以某种方式使用这些属性,那么您将不得不编写代码。没有办法避免这种情况。即使你有一个可以容纳任何东西的灵活的表结构,除非你用它做某事,否则没有必要保留一些东西,并且用它做某事的软件需要修改才能做到这一点。所以"解耦"的想法而且永远不必再改变任何东西只是一个抽象的梦想。
如果您打算保留数据,但根本没有任何计划任何(存储以便存储,例如出于可听性或合规性目的),您可以将它全部存储在灵活的字段(比如大型varchar)中作为XML或JSON结构。这将是完全灵活的。
在任何一种情况下,您都希望从单个表开始。该表可以包括每个设备的唯一主键,名称或序列号,型号,以及一系列在所有设备中通用或有用的列。如果某个属性很常见,但只存在于90%的设备上,则可以为该属性创建一个列,并在不适用时将其保留为空。如果一个属性或一组属性只属于一小部分设备,我会考虑将它们分成一个或多个单独的表,但使用相同的主键。为了帮助将代码与模式更改隔离开来,您可以构建一个以有用的方式将表连接在一起的视图,并使用视图作为存储过程或select语句的基础。