数据库模型面向对象设计?

时间:2011-07-06 23:25:44

标签: c# sql database class-design

我如何设计c#中的类来表示数据库模型?

给出数据库的以下表格和字段,

表:员工

Pk EmpID
   Lname
   Fname
   Adress
Fk DeptID

表:部门

Pk DeptID
   DeptName
   Location

好的,现在我想在C#中创建2个类,一个用于Employee,一个用于Department。我挂掉的部分是外键。我应该在设计中使用外键作为对象,还是应该在部门的Employee类中添加引用,还是应该在我的Department类中列出员工引用列表,还是应该同时执行这两项操作?我知道如果我使用外键,效率会降低,因为我必须搜索与外键匹配的主键列表,但我可能应该将它们包含在设计中。

4 个答案:

答案 0 :(得分:3)

请勿在对象中使用“外键”。使用参考;每个部门都应该有一份员工清单。根据您是否需要从员工反向引用其部门,确定员工是否会引用部门。

答案 1 :(得分:3)

关于@Paul Sonier的详细解答......

P.S。我在一般意义上使用业务层业务类,而不是某些特定技术设计模式的行话。

使用数据库密钥的具体问题
使用数据库密钥将导致编码开销的爆炸,以保持对象和数据库同步。由于需要添加,更改,删除对象(通过用户GUI),您将疯狂地跳过篮球。当父对象在数据库中尚不存在时,您将如何创建子对象?想象一下,尝试使用任何N级数据结构。

始终设计业务类而不考虑数据存储
业务层类应忠实地反映业务规则,术语,概念和上下文。从长远来看,用非商业资料对这个“想法空间”进行污染,其中包含有关存储或显示数据的详细信息。现在听我说,以后相信我。

基于某些特定数据库表布局(以及它的键等)的业务类将使编写用于验证规则的代码,创建这些对象的正确状态等等变得极其困难。这是保持对象ID与数据库同步的问题。

最大化业务层和数据层的解耦
您的问题中显示的示例是诱人的欺骗。您的某些业务类可能非常适合您的数据库设计。因此,主键和外键似乎也适合。

但是 在任何非平凡的应用程序中,数据库模型偏离。如果不是现在,稍后。它将偏离数据库完整性,效率和速度的目的。这与商业模式有什么关系?没有。

您做得对的指标

  1. 您可以在没有现有数据库的情况下实例化业务对象

  2. 每个对象都可以引用它的“子”,而不需要在业务类模型之外创建特殊键。

  3. 每个业务对象自己可以验证,强制执行,标记等所有它自己的规则,甚至像“不能”这样的微不足道的规则空白”。复合类/对象的业务规则验证是类设计&分析活动 - 而不是数据库设计活动。

答案 2 :(得分:0)

首先,如果可能的话,我建议使用像NHibernate,Entity Framework或Linq to SQL这样的工具来为你做关系映射的对象。但是,如果你不想这样做,我可能会设计我的对象模型:

public class Employee
{
    public int Id { get; set; }
    public string LastName { get; set; }
    public string FirstName { get; set; }
    public Address Address { get; set; } 
    public Department Department { get; set; }
}

public class Department
{
    public int Id { get; set; }
    public string Name { get; set; }
    public Address Location { get; set; }
    public ICollection<Employee> Employees { get; set; }
}

答案 3 :(得分:0)

我不想过度简化,但如果你有来自Employee的导航属性=&gt;部门或部门=&gt;员工非常专注于您的应用程序的需求。

然而,根据经验,我倾向于从层次结构的顶部放置导航属性。这意味着我会有Department.Employees而不是Employee.Departments。

同样,这是特定于您的,但您似乎不太可能需要从每个Employee获取Department对象。因此,使用Employee类中的键进行查找,如下所示:

class Employee {

    public int[] DepartmentIds { get; set; }
    public List<Department> Departments {
        get {
            return YourStaticReference.DepartmentList
                .Where(x => this.DepartmentIds.Contains(x.DepartmentId));
        }
    }
}

请参阅?祝你好运!