我想写一个应用程序如下:
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
我尝试使用这种方式。
,因为 在将来我向特定部门添加新属性时 只是,从父类扩展的新类包含特定属性
而不是在数据库中添加新列。
这是一个好方法,它怎么能这样做?
答案 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