将属性存储为(名称 - 值对)表?

时间:2016-01-16 18:25:45

标签: c# sql-server vb.net

我想写一个应用程序如下:

SQL表是名称:(DepProperties)

String command = "Get-ItemProperty " +
                "HKLM:\\Software\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\* " +
                "| Select-Object DisplayName, DisplayVersion, Publisher, InstallDate " +
                "| Format-Table –AutoSize";

System.out.println(PowerShell.executeSingleCommand(command).getCommandOutput());

并通过[DepId]获取所有值

+----+-------+----------+------------------------+------------+
| Id | DepId |   Type   |          Name          |   Value    |
+----+-------+----------+------------------------+------------+
|  2 |   123 | String   | DepartmentDescription  | xxxx       |
|  3 |   123 | DateTime | DateCreated            | xx/xx/xxxx |
|  4 |   321 | String   | DepartmentDescription  | xxxx       |
|  5 |   321 | Boolean  | NewerDep               | xx/xx/xxxx |
+----+-------+----------+------------------------+------------+

和,在VB.Net中序列化到类

select * from DepProperties where DepId = 123

我尝试使用这种方式。

,因为 在将来我向特定部门添加新属性时 只是,从父类扩展的新类包含特定属性

而不是在数据库中添加新列。

这是一个好方法,它怎么能这样做?

1 个答案:

答案 0 :(得分:1)

你提出的建议通常被称为Entity-Attribute-Value设计(或简称EAV),正如@DanGuzman在他的评论中指出的那样,根据许多因素,它可能成为一个性能问题,包括:

  • 表格中的行数
  • 同时使用该表的并发连接数
  • 如何编写客户端代码;即它是否使用此模式存储其所有数据,或仅适用于有限数量的属性?

有很多商业系统都是基于这样设计的,它们支持大量并发,包含大量行和设计良好的客户端代码。

来自维基百科关于EAV 1 的文章:

  

如上所述,使用EAV模型的典型情况是高度稀疏的异构属性,例如电子病历(EMR)中的临床参数。但是,即使在这里,也可以准确地说明EAV建模原理应用于数据库的子模式而不是其所有内容。 (例如,患者人口统计数据最自然地以每列属性一列的传统关系结构建模。)

     

因此,有关EAV与"关系"的争论。设计反映了对问题的不完全理解:EAV设计应仅用于需要对稀疏属性进行建模的数据库的子模式:即使在这里,它们也需要得到第三范式元数据表的支持。遇到稀疏属性的数据库设计问题相对较少:这就是EAV设计适用的情况相对较少的原因。即使遇到它们,一组EAV表也不是解决稀疏数据的唯一方法:当每个实体的最大属性数量相对适中时,基于XML的解决方案(下面讨论)适用,并且稀疏的总体积也是如此数据也同样适度。这种情况的一个例子是捕获不同产品类型的变量属性的问题。

     

稀疏属性也可能出现在电子商务的情况下,即组织正在购买或销售大量且高度多样化的商品,其中各类商品的细节变化很大。

您可能需要考虑使用以下表格设计:

CREATE TABLE dbo.DepProperties
(
    DepPropertiesID INT NOT NULL
        CONSTRAINT PK_DepProperties
        PRIMARY KEY CLUSTERED
        IDENTITY(1,1)
    , DepId INT NOT NULL
    , PropertyType VARCHAR(50) NOT NULL
    , PropertyName VARCHAR(50) NOT NULL
    , PropertyValueString VARCHAR(247) NULL /* Adjust this number to
                                               allow for the largest
                                               value you want to 
                                               support */
    , PropertyValueInt INT NULL
    , PropertyValueDate DATE NULL
    , PropertyValueDateTime DATETIME NULL
    , PropertyValueDecimal DECIMAL(20, 10) /* Adjust per your needs */
);

注意,"值"列可以为空,每种类型的数据都有离散列。这样可以保持类型安全。

1 - https://en.wikipedia.org/wiki/Entity-attribute-value_model#Modeling_sparse_attributes