我正在开发一个首先使用Entity Framework代码的Web应用程序(MVC),我正在试图弄清楚如何对此进行建模。我当然可以在一个类中添加15个bool值(数据库中的位),但这似乎是一种可悲的方式。我目前有一个客户对象,其中包含下图中显示的策略对象。
我希望我的观点看起来就像上面那样,目前没有计划添加第6个,但是设计模型来支持这种可能性很重要。
public class customer{
//some random properties like Id, Name, Owner, Etc.
//I could put 15 bools here for the policies in the image
//I could put a policy object here?
}
答案 0 :(得分:2)
这是一个简单,自我描述,可扩展,规范化和可扩展的设计。您可以添加其他策略类型或患者类型,而无需重新编译系统。您没有说明您正在使用哪个数据库引擎,因此为了使其适用于大多数数据库平台,我建议您使用TPC。
患者只是一个人(aka party)在系统中扮演的角色。您可以拥有其他角色,例如“医生”,“员工”,“保单持有人”等,每个角色都有自己的数据。重要的是要注意角色是暂时的,意味着单个角色可以无效,而人在系统中执行其他角色。
如果可以通过查看角色或派对的属性来确定“现有”,“AgeIn”,“NewPatient”,则不需要PatientType。我添加它是因为不清楚如何定义耐心的类型。你很可能只是在患者身上有一个属性来定义它。
一方代表任何法律实体。缔约方之间的关系往往对企业很重要。因此,当“Sam”(一个人)来到“Doctor”(一个扮演角色的人)时,重要的是要知道她的父亲Bob(一个人)的“政策”将支付账单。因此,Person被映射到不同的表中的原因。
PolicyType定义策略的实际类型。在您的情况下,您可能有18种不同的策略类型,如ExistingOriginalMediCare,AgeInOriginalMediCare等。您可以在此处存储影响策略“规则”的数据。例如,某些类型的政策仅适用于居住在加利福尼亚州的人。我工作的一个系统有数千个策略类型,每个策略类型都有数百个应用程序用于推断业务规则的属性。这允许企业创建新的策略类型和“规则”,而无需重新编译系统以及依赖于它的所有内容。
但是,可以通过在保持相同功能的同时取出继承来简化它。在这里,我们假设除了“患者”之外没有其他“角色”,没有其他“聚会”而不是“人”。
也就是说,这实际上取决于数据是否会被其他应用程序重用,以及时间数据和关联的确如何。随意适应。我经常在设计系统时参考这些书:
答案 1 :(得分:1)
你可以看一下TPT(每种类型的表格),看看这里http://blogs.microsoft.co.il/blogs/gilf/archive/2010/01/22/table-per-type-inheritance-in-entity-framework.aspx
这意味着您可以为扩展基表的每个不同概念创建一个表。这样做的好处是,以后您可以向特定类型添加其他信息。
EG,客户将成为您的根表,然后使用OriginalMedicareCustomer等概念进行扩展
答案 2 :(得分:1)
如果你想将它标准化,我建议你这样做:
public class Customer {
// id, name, owner, etc
public virtual IList<CustomerPolicy> Policies { get; set; }
}
public class CustomerPolicy {
// id, name, etc
public bool ExistingPatient { get; set; }
public bool AgeInPatient { get; set; }
public bool NewPatient { get; set; }
}
在不了解您的申请的情况下,我不能说,但我猜每个政策的三个布尔是互斥的?如果是这样,我会做这样的事情:
public enum PatientType { Existing, AgeIn, NewPatient };
public class CustomerPolicy {
// id, name, etc
public PatientType PatientType { get; set; }
}
答案 3 :(得分:1)
我不完全确定您的数据要求,但我保持简单并且在一两个表内,就像这样...
public class Customer
{
public int CustomerID { get; set; }
// or implement it via enum like below for policy type
public bool Existing { get; set; }
public bool AgeIn { get; set; }
public bool New{ get; set; }
// no 'virtual' means it's 'required', with virtual could be 'null'
public Policy Policy { get; set; }
}
public enum PolicyBits
{
None = 0x00,
ExistingOriginalMediCare = 0x01,
// ...
AgeInOriginalMediCare = 0x100,
// ...
}
public class Policy
{
public int PolicyID { get; set; }
public int PolicyTypeValue { get; set; }
[NotMapped]
public PolicyBits PolicyType
{
get { return (PolicyBits)PolicyTypeValue; }
set { PolicyTypeValue = (int)value; }
}
}
...枚举可以帮助您减少&#39;比特数量。 - 但它还没有正式支持,将来自下一个版本,到目前为止只有实验,VS 2011和.NET 4.5(我记得)。
但你可以用下面的东西临时解决它。
至于表格的模型 - 我不确定你想如何切换&#39;在现有用户,新用户用户或年龄用户之间 - 或者你可以同时拥有两个或全部三个用户等等。由于所有这些都是比特我认为一个字段应该足够 - 并且可能把它放在一个单独的表中主要是分离 - 即你可以重新定义,添加新东西或引入新记录等。