Sql 我应该如何(如果我应该的话)实现通用DB表而不陷入内部平台效应?

Sql 我应该如何(如果我应该的话)实现通用DB表而不陷入内部平台效应?,sql,database,generics,database-design,dynamic,Sql,Database,Generics,Database Design,Dynamic,我有这样一个db模型: tb_Computer (N - N) tb_Computer_Peripheral (N - 1) tb_Peripheral 每台计算机有N个外围设备。但每个外围设备的性质不同,并且会有不同的领域。键盘有型号、语言等,网卡有速度等规格 但我认为创建的表不如外围设备那么多是不可行的。因为总有一天会有人想出一个非常特殊的外设,我不希望他因为它既不是键盘也不是网卡而无法添加外设 在tb_外围设备中创建包含特定外围设备JSON数据的字段data,这是一种不好的做法吗 我甚至

我有这样一个db模型:

tb_Computer (N - N) tb_Computer_Peripheral (N - 1) tb_Peripheral
每台计算机有N个外围设备。但每个外围设备的性质不同,并且会有不同的领域。键盘有型号、语言等,网卡有速度等规格

但我认为创建的表不如外围设备那么多是不可行的。因为总有一天会有人想出一个非常特殊的外设,我不希望他因为它既不是键盘也不是网卡而无法添加外设

在tb_外围设备中创建包含特定外围设备JSON数据的字段
data
,这是一种不好的做法吗

我甚至可以创建一个
tb_peripheraldype
,其中包含关于特定类型的外围设备具有哪些数据的特定信息

我在很多地方都读到过这篇文章,发现这是一种不好的做法,但我想不出任何其他方法来实现这一点,完全动态的

实现我想要的最好方法是什么?目前的模式错了吗?你会怎么做?

这不是“好做法”或“坏做法”的问题。使事物完全动态化有好的一面也有坏的一面。你已经很好地勾勒出了好处

完全动态设计的缺点是,将数据转换为有用信息的过程远不像在设计范围内固定数据语义的数据库那样常规

当您开始添加关于新类型外围设备的数据时,是否可以构建一个报告和一个报告生成过程,以适应新的数据结构?如果在需求发生变化时,您最终不得不对应用程序进行维护,那么通过使数据库设计完全动态,您获得了什么好处


PS:如果对数据库设计的更改只包括添加新表,那么对现有应用程序的“涟漪效应”将可以忽略不计

我可以想出四种选择

第一种方法是创建一个表peripherals,其中包含您可能需要的有关外围设备的所有信息。在字段不适合该类型的列中,这将有空值。添加新外围设备时,必须添加描述性列

第二个是为每个外围设备创建一个单独的表

第三种是用类似JSON的方式对信息进行编码

第四个是成对存储数据。因此,每个外围设备将有许多不同的行

这些方法也有混合。例如,您可以将公共字段存储在单个表(ala(1))中,然后为其他值创建键值对

问题是如何使用这些信息。我的大部分工作都是直接用SQL完成的,所以对我来说最糟糕的选择是(3)。我不想解析奇怪的信息格式来获得对SQL查询可能有用的东西

选项(4)是最灵活的,但它也需要更多的工作来获得所有可能属性的完整图片


如果我是从零开始的,并且我对我想要的字段有一个很好的想法,那么我将从(1)开始,一个用于外围设备的表。如果我有外设和属性会有规律地变化的要求,那么我会认真考虑(4)。如果表只被应用程序使用,那么我可以考虑(3),但是无论如何我都会拒绝它。

当你做这种设计时,只有一个问题要回答。JSON、序列化对象、xml或csv都不重要

您想在了解结构的API之外使用它们吗

如果您想说使用sql获取键盘类型的所有外设,并且键数属性>=102,请说

如果你这样做,它会变得凌乱,比额外的桌子更凌乱。 也就是说,拥有一个PDF或文档表,并试图找到所有超过10页的PDF或文档

如果您希望随着应用程序的发展对内容进行版本化,则会变得更加有趣


看看Nosql后端,它是为这样的东西设计的,关系数据库不是。

您所说的是“实体属性值”模式。如果您使用的是PostgreSQL,那么您可以使用hstore数据类型实现一种非常有效的动态属性生成方法。SQL Server是否具有类似的功能?
我不想解析奇怪的信息格式来获取对SQL查询可能有用的信息。
您确实有道理。这将使报告更难完成。不过,我真的很喜欢这个选项(4)。我不认为这需要更多的工作,因为我并不需要所有可能属性的图片。我可以有一个表N-N,并在需要时包含属性。然而,我不知道性能方面这是否会有多大影响,因为将有无数行代表单个外围设备。@ConradClark。使用数据库的优势在于,它可以通过利用所有可用硬件和使用索引来优化这些搜索。你认为“ZLILUNY”可能仍然适用于Excel电子表格。在这种情况下,有了一台像样的服务器,选项(4)的性能对于大多数应用程序来说应该是不错的。非常感谢,投票结果是,我希望我能对你和gordon的答案都打分。你提供了洞察力,他提供了可用的选项。