Database design 我应该在应用程序中反映数据库结构吗?

Database design 我应该在应用程序中反映数据库结构吗?,database-design,Database Design,我正在设计一个应用程序,它将允许在数据库中放置一些数据。我想以某种方式反映应用程序中的数据库结构,例如,如果我有一个表,其中有部门和一个包含员工的表,有一个部门id为3,与他相关的两个员工id为44和123,在我的应用程序中,将有一个属性Id设置为3的类部门,它将引用两个Id设置为44和123的员工类 我和我的同事谈过这个问题,他说我不应该在应用程序中反映数据库结构——应用程序应该对数据源一无所知。这听起来很聪明,但如果我的类中没有Id属性(它们肯定反映了数据库结构),我就不可能知道哪些员工的属

我正在设计一个应用程序,它将允许在数据库中放置一些数据。我想以某种方式反映应用程序中的数据库结构,例如,如果我有一个表,其中有部门和一个包含员工的表,有一个部门id为3,与他相关的两个员工id为44和123,在我的应用程序中,将有一个属性Id设置为3的类部门,它将引用两个Id设置为44和123的员工类

我和我的同事谈过这个问题,他说我不应该在应用程序中反映数据库结构——应用程序应该对数据源一无所知。这听起来很聪明,但如果我的类中没有Id属性(它们肯定反映了数据库结构),我就不可能知道哪些员工的属性发生了更改,也无法将数据放回数据库。我很困惑——我听说过将数据库结构反映为对象的框架(例如hibernate),但我不确定它是否如此糟糕


你觉得怎么样?

你要找的是一个好的工作。这是一个自动处理在数据库和对象之间推送数据的框架。

应用程序应该反映用户需求/用户故事。数据库应该是应用程序的逻辑数据存储。

好吧,我想说的是,ORM框架(如Hibernate)的要点是将数据库结构和对象模型解耦,而不是促进它们的相同性

关于如何设计对象模型和数据库模式,有不同的理念,这取决于您与谁交谈。许多应用程序开发人员基本上将DB视为一个比特桶,让应用程序的需求驱动DB模式的设计。因此,例如,应用程序开发人员可以允许给定ORM框架的特性施加在DB模式设计上,在DB开发人员不愿意的情况下,他们可以很好地去规范化某些东西,等等

另一方面,DB开发者通常将DB视为更基本的,而且并非没有充分的理由:通常许多应用程序需要针对单个DB工作,DBs通常比应用程序更持久,数据比应用程序更有价值,诸如此类。所以,如果你的论点是“好吧,Hibernate需要某某…”,他们会展开一场相当激烈的斗争


我认为两个阵营都会同意,尽管没有必要——甚至没有愿望——在类和表之间争取1-1的关系。比如说,在应用程序世界中运行良好的类之间的关系可能会变成在数据库世界中根本无法执行的连接。例如,有不同的方法将类继承映射到DB模式,正确的选择取决于规范化和性能问题,而不是盲目要求类/表映射为1-1。您可能有一些组件没有自己独立的生命周期(例如,一个仅与某个
用户相关的
地址
),很多时候人们只是将其映射到用户表中的列列表,而不是将其本身作为一级实体,从而保存联接,因此强调了它的非独立性,等等。

我知道我不需要精确地反映数据库结构(特别是如果它对应用程序没有帮助的话)但在我提供的示例中,我想不出任何其他方法可以识别应用程序中哪些员工记录已更改,哪些数据需要在数据库中更改-我说得对吗?

我的意思是-我的Employee类将有它的ID属性,而这个ID是数据库中记录的ID,这是一个坏主意吗?

理想情况下,您的应用程序不需要知道对象是如何存储的(如果它们是存储的)。但大多数情况下,您需要在会话之间持久化对象,并且需要某种对象持久化,可以手动实现,也可以通过OPF(Obj持久化框架)实现。
通常,它是一个关系数据库,您描述的对象关系可以通过一个简单的主详细情况来实现,其中DeptId是Employee表中的外键,用于将其连接到Department表,或者它可以是一个关系表EmpDept,其中包含所有关联的EmpId和DeptId。
这个物理实现细节可以隐藏在业务逻辑中,但您仍然需要知道员工属于某个部门。

所以你的同事不是很对,因为你需要知道一名员工持有它所属的部门Id。

威利的回答很好。就我个人而言,我更喜欢把数据库当作一个小桶。我的提示是:如果你真的希望你的数据模型和你的对象模型是一样的(而且它们是一样的绝对没有错!),使用对象数据库。因为,在这种情况下,关系层不会给您带来太多好处

如果您选择一个ActiveRecord样式的对象数据库(如SansteneDB),您要做的是:创建域对象而不考虑数据存储。当对象工作正常时,向其发送“save”消息,并将其自身写入数据库。就这样。没有配置!它将自动生成自己的id,通过该id,您可以从数据库中快速检索它

如果您采用传统的方式并使用RDBMS,您可以远离数据库设计,但为什么要这样做呢?你设计桌子不是为了好玩。有些工具会根据表定义自动生成对象:没关系。它们通常提供了一个良好的开端。如果出现问题,可以只更改对象,或只更改数据定义,或同时更改两者。只要看看你的代码,看看什么更方便


Niko不信任你的同事,在我的书里没有。域ob