数据库设计意见与通用对象

时间:2011-08-23 15:32:51

标签: database-design

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

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

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

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

如果有人对表设计的好方法有意见,那么我会很感激。

我的一种方法是使用日期时间戳和属性的日期类型创建一个头表:

[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)

第三种可能性是我可以将对象中的所有属性转换为字符串并以这种方式保存它们 - 它会让生活变得更轻松但是有点笨拙?

3 个答案:

答案 0 :(得分:1)

您正在描述“名称价值”理念的变体 - 它在Stack Overflow上有着引以为豪的传统。

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

名称/值的主要缺点是使用多个“where”子句编写查询,尤其是使用布尔运算符。想象一下,找到一个城市是“阿姆斯特丹”的记录,价值在12到34之间,天气在('很好','非常好','阳光')。

替代解决方案包括以XML格式存储数据(SQL Server中的本机),或者设计包含所有可能列的表(如果事先知道它们)。

据我所知,在SQL中没有“好的”关系方式。

答案 1 :(得分:1)

我会把它放在一张桌子里。

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)

答案 2 :(得分:0)

结帐How FriendFeed uses MySQL to store schema-less data

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

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

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