C# 面向对象设计的数据库模型?
我该如何设计类,用c#表示数据库模型 给定数据库的以下表和字段 表格:员工C# 面向对象设计的数据库模型?,c#,sql,database,class-design,C#,Sql,Database,Class Design,我该如何设计类,用c#表示数据库模型 给定数据库的以下表和字段 表格:员工 Pk EmpID Lname Fname Adress Fk DeptID 表格:部门 Pk DeptID DeptName Location 好的,现在我想用C#做两个班,一个给员工,一个给部门。我挂断的部分是外键。我应该在设计对象时使用外键,还是应该在部门的Employee类中放置一个引用,还是应该在Department类中放置一个Employee引用列表,还是应该同时执行这两项操作
Pk EmpID
Lname
Fname
Adress
Fk DeptID
表格:部门
Pk DeptID
DeptName
Location
好的,现在我想用C#做两个班,一个给员工,一个给部门。我挂断的部分是外键。我应该在设计对象时使用外键,还是应该在部门的Employee类中放置一个引用,还是应该在Department类中放置一个Employee引用列表,还是应该同时执行这两项操作?我知道如果我使用外键,效率会降低,因为我必须搜索与外键匹配的主键列表,但我可能应该在设计中包含它们 不要在对象中使用“外键”。使用参考文献;每个部门都应该有一份员工名单。根据您是否需要将员工的引用回溯到其部门,确定员工是否将引用到部门。首先,如果可能,我建议使用NHibernate、实体框架或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; }
}
class Employee {
public int[] DepartmentIds { get; set; }
public List<Department> Departments {
get {
return YourStaticReference.DepartmentList
.Where(x => this.DepartmentIds.Contains(x.DepartmentId));
}
}
}
公共类员工
{
公共int Id{get;set;}
公共字符串LastName{get;set;}
公共字符串名{get;set;}
公共广播地址{get;set;}
公共部门部门{get;set;}
}
公共课系
{
公共int Id{get;set;}
公共字符串名称{get;set;}
公共广播位置{get;set;}
公共ICollection雇员{get;set;}
}
我不想过于简化,但如果您拥有Employee=>Department或Department=>Employee的导航属性,则Employee会根据您的应用程序的需要而非常具体
然而,根据经验,我倾向于将导航属性从继承权的顶部向下放置。这意味着我会有部门。员工,但不是员工。部门
同样,这是特定于您的,但是您似乎不太可能需要从每个员工那里获取部门对象。因此,在Employee类中使用键进行查找,如下所示:
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; }
}
class Employee {
public int[] DepartmentIds { get; set; }
public List<Department> Departments {
get {
return YourStaticReference.DepartmentList
.Where(x => this.DepartmentIds.Contains(x.DepartmentId));
}
}
}
class员工{
public int[]部门ID{get;set;}
公开名单部门{
得到{
返回您的StaticReference.DepartmentList
其中(x=>this.DepartmentId.Contains(x.DepartmentId));
}
}
}
看到了吗?祝你好运 关于@Paul Sonier答案的详细阐述 另外,我使用的是一般意义上的业务层、业务类,而不是某些特定技术设计模式的行话 使用数据库键的具体问题
使用数据库键将导致编码开销的爆炸,以保持对象和数据库同步。当需要添加、更改、删除对象时(通过用户GUI),你会像疯了一样跳出圈套。当数据库中还不存在父对象时,如何创建子对象?想象一下,尝试使用任何N级数据结构来实现这一点。
始终设计业务类而不考虑数据存储
业务层类应该忠实地反映业务规则、术语、概念和上下文。从长远来看,用非商业的东西来污染这个“创意空间”,这些东西包含存储或显示数据的细节是不好的。现在听我说,以后相信我 基于某些特定数据库表布局(及其键等)的业务类将使编写代码以验证规则、创建这些对象的正确状态等变得非常困难。这是保持对象ID与数据库同步的首要问题。
最大限度地实现业务层和数据层的解耦
你问题中的例子是一个诱人的骗局。您的一些业务类可能与您的数据库设计非常匹配。因此,主键和外键似乎也适合 但是在任何非平凡的应用程序中,数据库模型都会出现偏差。如果现在不行,以后再说。它将偏离数据库完整性、效率和速度的目标。这与商业模式有什么关系?没有什么。
表明你做得对的指标
Pk DeptID
DeptName
Location
数据绑定时,在内存占用和引用方面,您的设计存在很多问题。循环引用问题将使@SupermansTshirt的工作变得更加困难。顺便说一句,如果你有一个SL或WPF应用程序,而不是List use ObservableCollection,那么没有什么能阻止你在你的系课上使用相同的技术。如果您通过服务发送此信息,请注意可能错误创建的大小。