- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我面临以下问题。
我正在建立一个人类信息数据库。所有人都可以分为三类:成年女性、成年男性、儿童。很明显,“高度”和“重量”等参数适用于所有类别。参数“子女人数”仅适用于成年人,而参数“怀孕人数”仅适用于女性。此外,根据类别的不同,每个参数都可以分为强制参数或可选参数(例如,对于成年人,参数“前伴侣数量”是可选的)。
当我加载(比如说)“height”和“weight”时,我检查这两个字段中的信息是否自洽。也就是说,我把身高=6'4''体重=10磅的记录标错了(显然,这在生理上是不可能的)。我有几个类似的验证规则。
当我插入一个关于人类的记录时,我需要反映信息的以下特征:
这个特定人类类别的最大可能信息(包括所有可选参数)。
类别所需的最少信息量(即,仅限必需字段)
为这个特定的人实际插入的内容(即,无论是否小于所需的最小信息量,都可以为这个人插入我所拥有的内容)。这里不重要的问题是,字段“xxx”可能有空值,因为我从未在其中插入任何内容,或者是因为我故意插入了空值。与具有默认值的字段相同的逻辑。所以应该在某个地方反映出我处理过这个特殊的领域。
已验证插入的信息量(即,即使我加载了大约5个字段,也只能检查3个字段的自一致性,而忽略了剩余的2个字段)。
所以我的问题是如何从技术上组织它。目前,所有这些必需的特性要么是硬编码的,没有统一的逻辑,要么被分解成完全独立的块。我需要建立一个统一的方法。
在这方面我有一些天真的想法。例如,对于每一类人,我可以创建并存储一个可能字段的列表(我称之为“模板”)。a可以标记那些必需的字段。
当我插入一个关于人类的记录时,我复制模板并标记这个模板中的哪些字段实际上已经被处理过。在下一阶段,我可以在模板的这个副本中标记那些当前将被验证的字段。
验证模块按以下方式进行了特别更正:对于每个验证过程,我创建一个列表,其中列出了在该特定验证过程中使用的字段。然后,我只调用那些验证过程,这些过程中的字段在模板的副本中实际标记为“待验证”,用于要验证的特定人员(见上一段)。
如你所见,这是解决这个问题最直接的方法。但我的猜测是,有很多相当标准化的方法,我并不知道。我真的怀疑我是世界上第一个解决这个问题的人。我不喜欢我的解决方案,因为编写代码来正确地反映复制的模板中记录发生的所有“更新”是非常痛苦的。
所以,我请你谈谈你对如何解决这个问题的看法。
最佳答案
我想这里有两个问题:
如何在数据库中存储多态数据?
如何验证复杂的业务规则?
你应该把它们分开来处理——试图同时解决这两个问题可能太难了。
例如,有几种方法可以处理rdbmses-orms中的多态数据,使用术语inheritance mapping。这里的三个解决方案——每类层次结构表、每子类表和每具体类表——是“纯”关系解决方案。您还可以使用“Entity-Attribute-Value”设计,或使用文档方法(以xml或json等结构化格式存储数据)——这些不是“纯”关系选项,而是有它们的位置。
验证复杂的业务规则通常是使用rule engines来完成的—这些都是非常酷的技术,但您必须确保您的问题真正符合他们的解决方案—决定投资于规则引擎意味着您的项目将更改为规则引擎项目,而不是“人类”项目。或者,大多数主流的解决方案都体现了应用程序业务逻辑层中实体的业务逻辑。听起来你已经长大了。
关于database - 有经验的数据库架构师的话题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15644274/
hi,我是熵减,见字如面。 对于从事软件开发的工程们来说,都有一个成为架构师的梦想。 可以说,不想当架构师的程序员,不是好的工程师,人人都想成为架构师。 而为什么要成为架构师,可能
Sencha Architect 是否需要打包、部署 Android/iOS 以及应用商店/Google Play 的应用程序?下面的文档似乎暗示 Architect 对于部署非常重要(包按钮): h
关闭。这个问题需要更多focused .它目前不接受答案。 想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post . 4年前关闭。 Improve this questi
我开始在 ExtJS Architect 中构建一个相当大的应用程序,我想知道是否建议将应用程序拆分为多个项目(准确地说是 Architect 定义项目的项目)? 目前我是唯一一位从事此应用程序的工程
我有一个传入的 Offering 对象数组,如下所示: [{ "id" : 16, "price" : 500, "quantity" : 2000, "denomination" :
我是一名优秀的程序员,十分优秀!