在关系数据库中保存任何类型的对象

时间:2012-02-28 20:05:19

标签: c# database relational-database object-persistence

它可能有点花哨,但是有没有任何模式或东西以最佳方式在关系数据库(而不是nosql)中存储任何类型的对象?

例如,没有最佳方式:

class Person{
    string FirstName {get;set;}
    string LastName {get;set;}
} 

class Product{
    string Name {get;set;}
    decimal Price {get;set;}
} 

并在数据库中:

CREATE TABLE Data
   (Id int PRIMARY KEY, 
    TypeName nvarchar(50), 
    PropertyName nvarchar(50), 
    PropertyValue binary)

然后记录存储在数据库中,如下所示:

1    Person    FirstName   Jalal

2    Person    LastName    A.R

3    Product   Name        Apple

4    Product   Price       2

4 个答案:

答案 0 :(得分:3)

您所描述的内容基本上是Entity-Attribute-Value表。

适用于潜在属性数量较多但潜在值较小的情况。这种用例的一个例子是医疗数据(症状),其中患者可能具有的潜在症状的数量很大,但实际症状的数量很少。

使用不当,这是Inner Platform Effect的典型示例。

答案 1 :(得分:2)

您可以将对象序列化为XML,并将其存储在数据库中。 SQL Server有一个专门的XML类型,甚至允许您查询内容。

这不是最佳解决方案,但它可以满足您的需求。

答案 2 :(得分:0)

不确定为什么你会这样做不是最佳的。如果要查找某个人,您需要对字符串值进行表扫描/索引查找,然后按主键过滤。

ORM会好得多 - nHibernate或实体框架(EF)他们会将每个类映射到表和autogenerat eth主键等,你可以将对象表示为子对象等。

EF也可以先做代码 - 这意味着你只需要编写类,它就会创建数据库并自动映射它们(nHibernate也可以这样做,我也不知道产品)

答案 3 :(得分:0)

您所描述的不是关系方法,因此我不明白您为什么要使用关系数据库。你将每个对象都集中在一个大表中。你完全失去了定义表间关系或执行关系操作的能力(比如“查找本月购买苹果的所有客户”)。