1

我正在开发一个使用实体框架代码的网络应用程序(MVC),我试图弄清楚如何对此进行建模。我当然可以向一个类(数据库中的位)添加 15 个布尔值,但这似乎是一种可悲的方式。我目前有一个客户对象,其中包含下图中显示的策略的对象。

在此处输入图像描述

我希望我的视图看起来就像上面的一样,目前没有计划添加第 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?
}
4

4 回答 4

2

这是一个简单、自我描述、可扩展、规范化和可扩展的设计。您可以添加其他策略类型或患者类型,而无需重新编译系统。您没有说明您使用的是哪个数据库引擎,因此为了使其在大多数数据库平台上工作,我建议您使用TPC

图表

病人只是一个人(又名当事人)在系统中扮演的角色。您可以拥有其他角色,例如“医生”、“员工”、“保单持有人”等,每个角色都有自己的数据。重要的是要注意角色是临时性的,这意味着可以取消单个角色,而该人在系统中执行其他角色。

如果“Existing”、“AgeIn”、“NewPatient”可以通过查看 Role 或 Party 的属性来确定,则不需要 PatientType。我添加它是因为尚不清楚耐心的类型是如何定义的。您很可能只是在 Patient 上有一个属性来定义它。

一方代表任何法律实体。各方之间的关系通常对企业很重要。因此,当“Sam”(一个人)来到“Doc​​tor”(一个扮演角色的人)时,重要的是要知道她的父亲 Bob(一个人)的“政策”将支付账单。因此,一个人被映射到不同的表中的原因。

PolicyType 定义策略的真正类型。在您的情况下,您可能有 18 种不同的保单类型,例如 ExistingOriginalMediCare、AgeInOriginalMediCare 等。您可以在此处存储影响策略“规则”的数据。例如,某些类型的政策仅适用于居住在加利福尼亚州的人。我使用的一个系统有数千种策略类型,每种策略类型都有数百个应用程序用来推断业务规则的属性。这允许企业创建新的策略类型和“规则”,而无需重新编译系统和依赖它的所有内容。

但是,可以通过在保持相同功能的同时取出继承来简化它。在这里,我们假设除了“患者”之外没有其他“角色”,除了“人”之外没有其他“当事人”。

简化模型

也就是说,这实际上取决于数据是否会被其他应用程序重用,以及时间数据和关联的真实情况如何。随意适应。我在设计系统时经常参考这些书:

  1. 企业模式和 MDA:使用原型模式和 UML 构建更好的软件
  2. 企业模型模式:描述世界(UML 版本)
  3. 数据模型资源书,第 3 卷:数据建模的通用模式

它们从根本上改变了我看待“数据”的方式。

于 2012-04-06T02:24:09.867 回答
1

您可以为此查看 TPT(每种类型的表),请查看此处http://blogs.microsoft.co.il/blogs/gilf/archive/2010/01/22/table-per-type-in​​heritance -in-entity-framework.aspx

这意味着您可以为每个扩展基表的不同概念创建一个表。这样做的好处是稍后您可以将附加信息添加到特定类型。

例如,客户将是您的根表,然后使用 OriginalMedicareCustomer 等概念进行扩展

于 2012-04-05T23:26:52.587 回答
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; }
}
于 2012-04-05T23:29:03.253 回答
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; }
    }
}

...枚举将帮助您缩减“位”的数量 - 但它尚未得到官方支持,它将来自下一个版本,到目前为止仅在实验性 VS 2011 和 .NET 4.5 中(我记得)。

但是您可以使用以下方法暂时解决它。

至于表格的模型——我不确定你想如何在现有用户、新用户或老用户之间“切换”——或者你是否可以同时拥有这三个或所有三个等等。因为所有这些都是我的'我认为一个字段应该足够了 - 并且可能将它放在一个单独的表中进行分离 - 即你可以重新定义它,添加新事物或引入新记录等。

于 2012-04-06T00:01:36.037 回答