这听起来像是白日梦,我想知道这是否可能。我希望能够获取一个名为info的C#动态对象,并将其持久化到数据库中(我目前使用的是SQL Server2008数据库)。
info对象是动态的,可以具有任意数量的属性:Id, Title, Content, DateExpires, DateAdded, Dateupdated, TypeOf等。
它的每个实例可以/将包含不同数量的属性,这取决于该实例的用途:博客帖子、分类广告、事件等。但是,每个info对象都会共享一组核心属性:Id, MemberId, TypeOf...
这个想法是,有一个中心表来存储所有动态信息对象,但允许我根据任何属性(对于某些对象可能不存在)进行查询。
例如,博客帖子。他们会有:Id, MemberId, DateAdded, Title, Content, TypeOf,等。事件应该是:Id, MemberId, Title, Content, TypeOf, DateOf, Recurrance, MinAge, MaxAge,等。
我想基于任何给定的info对象属性构建查询。
为什么?灵活性。如果我能让它正常工作,我就可以在我的web应用程序中使用info对象来处理未来的案例。如果这是一个非常糟糕的想法,请让我知道(以及为什么)。谢谢!
发布于 2011-08-23 21:09:27
这是可能的,我见过许多像this...however这样的系统,由于这种“通用性质”,这些系统通常是最难维护的。这种方法本身并没有什么问题。只是它很难完成,而且在大多数情况下,它最终是一个很差的实现。
近年来,非关系数据库(如@Marc Gravell提到的文档数据库)迎头赶上,它们非常适合某些领域,但您需要确保它适合您的项目。
当你走上构建这个“通用数据库”的道路时,你是在牺牲我们认为理所当然的其他众所周知的技术。例如,关系数据库中的数据库优化是众所周知的,并且有许多工具可以很好地使用它们,只需很少的工作或根本不需要做任何工作。如果你突然走了一条不同的道路,你习惯的工具可能不起作用,最终要么构建你自己的工具来弥补不起作用的东西(或者购买/选择一些深奥的工具)。
根据您项目的规模,明智的做法是构建一两个您认为常见的系统,然后尝试查看它们是否像您想象的那样常见。
发布于 2011-08-23 19:37:50
您可以为通用属性使用“基础”表,为其他属性使用属性名称-值表。含义:
Table Info
int Id (PK) (FK),
int MemberId,
Date DateAdded //etc...
Table Properties
int InfoId (PK),
varchar PropertyName (PK),
varchar PropertyValue,
string PropertyType //optionaly store information about the type of property查询后,您可以使用反射将属性从(名称,值)对转换为正确的属性。
也就是说,我认为这是一个非常糟糕的想法,有几个原因:
这会进一步增加你的CRUD逻辑的复杂性,你的域模型中没有定义良好的实体,我不这么认为,like
Post没有一个叫做Recurrance
只有当您确实需要这种灵活性时,我才会使用这种方法-例如:如果用户可以选择保存您事先不知道的自定义属性。
否则,如果您知道您的实体仅限于Post、Event、Employee等,我将仅限于此。
https://stackoverflow.com/questions/7160218
复制相似问题