我想问一个关于如何最好地构建一个类的对象的设计问题,我想拥有可搜索的字段,包括作为对象的字段 - 但也是模块化的,在某种意义上可以根据新条目添加字段在DB中。让我澄清一下:
假设我有一个对象类型,Car。汽车具有诸如品牌,型号,颜色,最高速度等属性,可以通过简单类型(如字符串和双打等)来表示。但它也可能包含更复杂的信息,例如类型为CarPowerProfile(一个单独的对象)的属性,保持一个方程式,描述车辆的功率输出作为节气门的函数。或者也许是其他子对象。
设计这样一个类的最佳方法是什么,这样我就可以搜索数据库,不仅可以搜索颜色,品牌和型号这样的简单属性,还可以说“找到一辆蓝色的汽车,价格在70%之间和30%油门的90%功率输出“?问题是,我需要执行计算以获取该信息的对象,并且数据库仅存储等式的系数。
另外,如果有人想要向对象添加属性(除了硬编码的“基本属性”),如何最好地实现这样,以便新属性同时在数据库和加载的对象中?最后,这个问题最适合关系数据库或非关系数据库,请记住,这将是一个与Web服务同步的独立应用程序。
我意识到我要求很多,但我不是在寻找代码分发,而是更多地寻找如何设计解决方案 - 这就是为什么我使用的是单词而不是代码来描述问题。我来自数值计算的背景,这种类型的软件设计对我来说很陌生。我更感兴趣的是,如果有这样的(或类似的)事物的设计模式,或者可能是一种不同的方法,因为我正在正确解决问题。
谢谢!
答案 0 :(得分:1)
有几种方法你可以解决这个问题,无论你是否优化阅读或写作,它们都会失败。
如果仅通过在数据库中保存核心值来优化写入,则查询会变得更加昂贵,因为您必须从数据库加载所有对象,然后进行计算以过滤它们。
另一方面,如果通过将计算值存储在数据库中来优化读取,则写入速度会变慢,因为在每次写入之前,您必须重新计算所有值,然后将所有正确的值写入数据库。
在您解释的情况下,我会尝试找到一个平衡点。将所有核心值存储在数据库中,并将所有核心值存储在您希望运行最多查询的位置。然后您可以对这些进行过滤,然后在应用程序服务器上进一步过滤它们。如果你做得对,你就会有很好的平衡。
如果您正在使用NHM或EntityFramework等ORM,则可以使用LINQ轻松查询多个表。
至于你是否应该选择关系,如果你想拥有一个灵活的架构,那么NoSQL解决方案可能更适合。但NoSQL也有一些缺点。您必须对(de)规范化应用与计算属性相同的权衡,请记住这在NoSQL数据库中非常重要。
像RavenDB这样的NoSQL解决方案,特别针对.NET进行了优化,可以定义Map Reduce查询,提供非常快速的查询访问权限,所以我可以看一下
答案 1 :(得分:0)
第一部分
那么,你可以存储方程的变量,这些变量对于数据库中的不同汽车具有不同的值,并将基本方程写为函数或存储过程来计算
第二部分
为此,您应该为类的属性创建动态结构。 因此,您必须为保留 PropName & PropType &的属性创建一个表(For Ex:PropertyTbl)。的 PropValue 强> 并在您的类中创建一个列表来保存属性(在数据库中)和一个方法(并在每次运行应用程序时调用它)以使用PropertyTbl记录填充该列表。 通过这种方式,您应该创建一个动态UI,为PropertyTbl中的属性生成适当的控件。
第三部分
它与您的数据结构更相关。 有些数据是关系型的,有些则不是。 请参阅以下链接以了解: NoSql vs Relational database http://www.zdnet.com/rdbms-vs-nosql-how-do-you-pick-7000020803/
(还有别的!?在评论中说出来!成功)