当使用O / R映射时,我应该从哪里开始设计?对象还是数据库表?

9
我正在开始一个新的数据库应用程序,我想知道是最好从对象(使用UML)开始设计,并相应地构建数据库模式,还是从数据库设计(使用ER)开始并相应地创建对象。这两种方法各有优缺点。
(不过我认为这并不重要,但以防万一:我打算使用Java和Hibernate)
8个回答

12

取决于你的应用是为了满足用户需求还是开发人员需求。

从用户故事入手,确保面向对象编程(OOP)类的正确性。这样,你的用户会爱上你的应用。

否则你最终会得到一个将用户变成数据输入职员的应用。(你会有很多同行。)


5

从数据库开始的好处是能够考虑性能和DBA。

从面向对象编程开始的好处是能够获得更纯粹的OO设计,但你的ORM可能会表现不佳。

我发现黑盒子ORM太过限制,所以我的系统都是手写或通过代码生成和修改,这样我的数据库通常非常紧凑,而我的OO模型是纯粹的。我坚信聪明的人类是解决阻抗匹配问题的解决方案。


4
这取决于你的优势所在和想要达到的目标。如果从正确的地方开始,您可以从对象开始做起,并且包括数据库中良好的表设计,这样您就可以做得相当不错。
首先要从面向对象分析开始,而不是从面向对象设计开始。我无法强调分析和设计之间的区别有多大。写有关面向对象分析的人(其中一些人使用UML作为工具)尝试清楚地表明这种区别。 分析涉及问题域,而设计涉及解决域。无论您的方法是否面向对象,都很容易将它们混淆在一起。
如果您对项目要求进行了良好的OOA分析,则可以并行进行合理的构建概念数据模型,并使这两者彼此保持同步。构建概念数据模型时,建议您保持像ER模型这样的模型。
ER模型不会告诉您如何设计数据库。这就是重点。在数据建模中,将分析问题与设计问题分离的方法是使用ER建模进行分析,使用关系数据建模进行设计,至少在开始阶段是这样。
OOA与ER之间的映射非常简单,因此您可以平行管理这两个模型。可能有新的工具可帮助您处理这两种类型的模型。 ER与RDM之间的映射具有迷惑性。在最简单的映射中,您将每个实体转换为以实体标识为键的表,将每个关系转换为引用实体的外键键入的单独表。通过将某些外键插入实体表中来减少表的数量是可能且必要的,但这是一个细节。
从OOA开始,进行OOD设计和OOP编程。
从ER进行概念数据建模,然后进行逻辑数据建模的RDM,并使用特定于DBMS的SQL进行物理数据建模。如果您的项目太大无法在纸张或白板上建模,则肯定有工具可帮助您完成此操作。
定期构建已有内容,也许只是未构建部分的存根,并将您的应用程序设计与数据库设计相协调。如果您做得好,到一天结束时,您应该处于相当不错的状态。
如果您同时设计一个数据库和多个应用程序,则事情变得非常有趣。

2

从数据库层面开始,绝对会让你创建一个更容易被常规关系型数据库处理的数据库。因此,如果你期望获得成千上万甚至数百万个对象,这就是我会采取的方法。然而,如果你不期望获取那么多数据,或者性能无关紧要,我会选择对象方法,因为它将允许你建模一个更符合实际应用程序的解决方案。


2

这取决于您想要最佳性能的地方。如果您预计数据库成为瓶颈,则应从那里开始设计,以便您可以调整其性能。如果您仅使用数据库保存需要在应用程序中具有高性能的几个对象的状态,则相应地进行设计。与好的编译器相比,O / R映射软件在性能调优方面还不够可靠(尚未,而且它们不会很快追上)。您仍然需要更好地设计性能(尽管开发成本较高)。


2
如果你正在编写一个面向对象的应用程序,那么我认为先设计对象是开始的地方。我宁愿先创建一个好的面向对象设计,然后尝试优化数据库,而不是先构建数据库,然后尝试将对象适配到数据库。
ORM工具使您可以专注于对象设计。
但是,它不能取代良好的数据库设计。您仍然需要关注数据库。我发现通过仔细思考,可以完成OR映射,从而创建出相当优化的数据库。如果发现某些查询性能不佳,则可以随时查看并尝试优化这些查询。
你不应该建立一个符合数据库模型的应用程序,数据库应该被设计为支持你的应用程序。ORM工具也可以帮助你创建优化的数据库和查询。

1

这要看情况。你是在进行面向对象编程还是SQL编程?


1

两种方法都可以奏效,每种方法都有其优缺点。以数据库为中心的方法非常适合许多共享数据的应用程序。以对象为中心的方法非常适合快速启动单个应用程序。

如果数据库不存在,我会考虑在不担心它的情况下构建应用程序。也许像db4objs这样的东西可以为您提供所需的对象持久性,同时将应用程序发展成为有用的东西。稍后,当新的应用程序被设计用于共享数据或临时查询变得重要时,关系型数据库映射更有意义。也许您永远不需要关系型数据库。需要时再构建它。

如果数据库已经存在,或者将数据放入其中是必需的,我仍然会尽可能推迟关系工作,并使对象和代码正常工作。但是,如果我看到自己编写复杂的代码,可以通过SQL完成,我会改变主意。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接