如何使用C#中的数据库中的模块化,可搜索字段创建对象?

pra*_*st1 5 c# architecture

我想问一个关于如何最好地构建一个类的对象的设计问题,我想拥有可搜索的字段,包括作为对象的字段 - 但也是模块化的,在某种意义上,可以根据数据库中的新条目添加字段.让我澄清一下:

假设我有一个对象类型,Car.汽车具有诸如品牌,型号,颜色,最高速度等属性,可以通过简单类型(如字符串和双打等)来表示.但它也可能包含更复杂的信息,例如类型为CarPowerProfile(一个单独的对象)的属性,保持一个方程式,描述车辆的功率输出作为节气门的函数.或者也许是其他子对象.

我的问题分解为以下几点:

设计这样一个类的最佳方法是什么,这样我就可以搜索数据库,不仅可以搜索颜色,品牌和型号这样的简单属性,还可以说"找到一辆蓝色的汽车,它的含量在70%到90%之间"功率输出为30%油门"?问题是,我需要执行计算以获取该信息的对象,并且数据库仅存储等式的系数.

另外,假设有人想要向对象添加属性(除了硬编码的"基本属性"),如何最好地实现这样,以便新属性同时在数据库和加载的对象中?最后,这个问题最适合关系数据库或非关系数据库,请记住,这将是一个与Web服务同步的独立应用程序.

我意识到我要求很多,但我不是在寻找代码讲义,而是更多的是如何设计解决方案 - 这就是为什么我使用的是单词而不是代码来描述问题.我来自数值计算的背景,这种类型的软件设计对我来说很陌生.我更感兴趣的是,如果有类似这样(或类似的)的设计模式,或者可能是一种不同的方法,因为我正在解决问题.

谢谢!

Ken*_*eth 1

有几种方法可以解决这个问题,无论您是针对阅读还是针对写作进行优化,它们基本上都会下降。

如果通过仅将核心值保存在数据库中来优化写入,则查询会变得更加昂贵,因为您必须从数据库加载所有对象,然后进行计算来过滤它们。

另一方面,如果通过将计算值存储在数据库中来优化读取,则写入速度会变慢,因为在每次写入之前,您必须重新计算所有值,然后将所有正确值写入数据库。

在你解释的情况下,我会尽力找到平衡点。将所有核心值以及您期望运行最多查询的少数计算值存储在数据库中。然后您可以对这些进行过滤,然后在应用程序服务器上进一步过滤它们。如果你做对了,你就会取得良好的平衡。

如果您使用的是 NHibernate 或 EntityFramework 等 ORM,则可以使用 LINQ 轻松查询多个表。

至于是否应该选择关系型,如果您想要灵活的模式,那么 NoSQL 解决方案可能更适合。但 NoSQL 也有一些缺点。您必须对(反)规范化应用与计算属性相同的权衡,请记住这在 NoSQL 数据库中非常重要。

像 RavenDB 这样专门针对 .NET 进行优化的 NoSQL 解决方案可以让您定义提供非常快速查询访问的 Map Reduce 查询,所以我想看看