Database design 具有泛型对象的数据库设计意见

Database design 具有泛型对象的数据库设计意见,database-design,Database Design,我有一个对象集合,需要定期将它们的属性记录到数据库中 每个对象可以有N个属性,每个属性可以是不同的数据类型。请注意,每个对象可以具有不同的属性和数据类型配置 现在,日期戳很简单,但是属性数组可以有多种不同的数据类型(货币、整数、布尔值、字符串)。我知道每个属性的数据类型,但是集合中的每个对象(可以在运行时检查)可能有不同的属性 我目前正在使用Sqlite,但还必须支持SQL Server 如果有人对桌子设计的好方法有意见,我将不胜感激 我的一种方法是创建一个带有datetime戳和属性datet

我有一个对象集合,需要定期将它们的属性记录到数据库中

每个对象可以有N个属性,每个属性可以是不同的数据类型。请注意,每个对象可以具有不同的属性和数据类型配置

现在,日期戳很简单,但是属性数组可以有多种不同的数据类型(货币、整数、布尔值、字符串)。我知道每个属性的数据类型,但是集合中的每个对象(可以在运行时检查)可能有不同的属性

我目前正在使用Sqlite,但还必须支持SQL Server

如果有人对桌子设计的好方法有意见,我将不胜感激

我的一种方法是创建一个带有datetime戳和属性datetype的头表:

[DataHeader]
ID (unique key)
ObjectID (int)
DateTimeStamp
PropertyDataTypeEnum (currency, datetime, int, etc)
然后为每个日期类型创建一个表:

[CurrencyData]
ID (FK)
PropertyID (int)
Data (currency)

[StringData]
ID (FK)
PropertyID (int)
Data (nvarchar//string)

[IntegerData]
ID (FK)
PropertyID (int)
Data (int)
我不喜欢这种方法,因为它使提取数据变得更加困难——而不仅仅是简单的连接——理想情况下,我想要一种更简单的方法

或者,我可以为对象中的属性创建标题表和子表:

[DataHeader]
ID (key)
DateTimeStamp

[DataProperties]
ID (FK)
PropertyID (int)
IntType (int)
CurrencyType (currency)
StringType (nvarchar//string)

第三种可能性是,我可以将对象中的所有属性转换为字符串,并以这种方式保存它们-这会使生活更简单,但有点不方便?

您描述的是“名称-值”思想的变体-它在堆栈溢出方面有着引以为豪的传统

这是解决SQL存储非结构化数据或具有可变结构的数据时遇到的问题的一种解决方案

name/value的主要缺点是使用多个“where”子句编写查询,尤其是使用布尔运算符。想象一下,找到一个记录,城市是“阿姆斯特丹”,数值在12到34之间,天气是“好”、“非常好”、“晴朗”

可供选择的解决方案包括以XML(SQL Server中的本机)存储数据,或者设计一个包含所有可能列的表(如果事先知道这些列的话)


据我所知,在SQL中没有“好的”关系方式来实现这一点。

我将把它放在一个表中

CREATE TABLE [MyTable](
    [ID] [int] IDENTITY(1,1) NOT NULL,  
    [DBDataType] [int] NOT NULL,    
    [ValueText] [nvarchar](255) NULL,
    [ValueMemo] [nvarchar](max) NULL,
    [ValueInt] [int] NULL,
    [ValueDate] [datetime] NULL,
    [ValueDecimal] [float] NULL,
    [TimeStampe] [datetime] NOT NULL)
退房

它们将无模式数据存储为单个BLOB、某种对象序列化格式或JSON或任何您想要的格式

当然,这意味着您不能使用SQL表达式访问blob的各个子字段,但您可以为每个要搜索的对象属性创建反向索引表。这允许您通过匹配给定属性中的值来查找行

要使这些反向索引表与序列化对象数据保持同步,需要做一些额外的工作。但是,当您超越传统的关系数据库设计时,您应该预料到额外的复杂性