OO和SQL

时间:2009-07-19 17:20:56

标签: sql database-design oop

在尝试理解程序对象与表格中的数据之间的相关性(这里:OO program and SQL database)时,我仍然不太了解,对于是否可以使用SQL表达了强烈的意见分歧db用于存储OO程序的数据。

  1. 对于新程序员,是否可以/推荐?

  2. 如果没有,OO程序的替代方案是程序性程序吗?

  3. 此外,我不理解 Object-relational impedance mismatch ,这是人们的意思,当他们说“使用SQL DB存储数据不合适”时对于一个OO程序“:有人可以总结它,还是有一个简单的例子来说明它?

7 个答案:

答案 0 :(得分:3)

  

对于新程序员,是否可以/推荐?

这个问题意味着系统设计/组件/架构被选择/旨在使程序员受益。

相反,我更喜欢选择设计/组件/架构以使系统(以及系统的所有者,用户和操作员)受益,并确保程序员知道(可能需要他们进行一些学习或培训)需要以发展该系统。

事实是:

  • OO通常是开发软件的好方法
  • SQL DB通常是存储数据的好方法
  • 设计从SQL到OO的映射可能非常重要
  

如果没有,OO程序的替代方案是程序性程序吗?

嗯,也许,是的:OO的一个特性是子类化,而子类/继承是在SQL数据库中建模/存储有问题的事情之一。

例如,给定像这样的OOD ......

class Animal
{
  int id;
  string name;
  abstract void eat();
  abstract void breed();
}

class Dog : Animal
{
  bool pedigree;
  override void eat() {...}
  override void breed() {...}
}

class Bird : Animal
{
  bool carnivore;
  int numberOfEggs;
  void fly() {...}
  override void eat() {...}
  override void breed() {...}
}

...使用2个SQL表来存储这些数据是不明显的,或者3.如果你把子类化了:

class Dog
{
  int id;
  string name;
  bool pedigree;
  void eat() {...}
  void breed() {...}
}

class Bird
{
  int id;
  string name;
  bool carnivore;
  int numberOfEggs;

  void fly() {...}
  void eat() {...}
  void breed() {...}
}

...然后使用恰好两个表格对这些数据建模更容易/更明显/更准确1比1 /更准确。

  

此外,我不明白对象关系阻抗不匹配

这篇文章比维基百科文章更长,更有名;也许它更容易理解:The Vietnam of Computer Science

请注意,提出问题的解决方案之一是:

  

手动映射。开发人员   接受它并不是那么难   毕竟手动解决的问题,   并直接写关系访问   将关系返回给的代码   语言,访问元组,和   根据需要填充对象。“

换句话说,在实践中这不是一个难题。理论上是一个难题,即很难编写一个自动创建映射的工具,而不必考虑它;但编程的许多方面都是如此,不仅仅是这一方面。

答案 1 :(得分:2)

我会说,如果肯定可以使用SQL数据库来存储面向对象程序的数据(我几乎一直这样做 - 而且它工作得很好)

程序与面向对象是一个相当大的争论;我认为您不应该根据您使用的存储类型进行选择:选择应该更多地关注您的代码和应用程​​序。

OOP具有许多优点,其中一个是(在我看来)更好的可维护性;更好的隔离,封装,以及所有这一切。实际上,在用OOP编程了几年之后,我会发现很难(我实际上......)做程序编程;使用一个独立的实体,让数据和相关方法在一个类中操作它们的能力真的很棒。

答案 2 :(得分:2)

使一个类=一个表的一个问题是规范化。类之间也存在关系,这些关系不容易一对一映射。所以我的建议是 - 在为数据库进行设计时,做一个正确的模式;在进行面向对象设计时,这样做而不依赖于DB(因此DB可以是XML,平面文件,甚至是手工编码的数组),然后编写另一个类,它将从以下形式获取值:你选择的数据库。

答案 3 :(得分:1)

首先,在SQL上使用OO很好。许多开发人员一直这样做,坦率地说,今天没有其他选择我认为甚至还有一半。

那说,这仍然是一些问题。中心的一个恕我直言,设计师/建筑师希望业务类将1-1映射到数据库表,而他们只是没有。它在高级设计中开始得很好,但真正的问题是你试图实现子类:它只是不能很好地映射到SQL和关系概念。

因此,必须将一些调解这种轻微不相容性(“阻抗不匹配”)的方法纳入开发中。这样做有很多不同的“手段”(工具,语言功能,数据库类型和选项,以及设计和开发学科),它们都有不同的优点和缺点。

你可以做到的结果,你应该这样做,我们中的许多人必须这样做,但中间肯定有一些肮脏的部分。

答案 4 :(得分:0)

SQL数据库是关系数据库。关系数据库目前是数据存储和检索(包括程序对象)方面的王者,除了noSQL运动,主要处理非常大的数据集。

为了协助对象和关系表之间的转换过程,大多数程序员使用某种对象关系映射器,如Linq to SQL或nHibernate。这大大减少了所需的工作量。

有面向对象的数据库可以直接读取和写入对象实例,但由于难以跨多个对象报告和检索数据,因此这些数据库尚未成为主流。

答案 5 :(得分:0)

致Chris W。,

这是克里斯(这个问题的提问者)。我想我的重新启动杀死了网站曾经记住我作为这个问题的作者的cookie。 (我想,在我再次获得50分之前,我现在无法发表评论)

在回复您对我的最后评论时,我理解您对编译时类型检查和sql没有那种奢侈的看法。您的观点是手动映射没有使用映射器的“检查”奢侈品吗?您是否可以使用映射器,然后在必要时手动映射同一程序? 再次感谢您的帮助!

答案 6 :(得分:0)

Chris W.的反应非常好,是我读过这个主题的最好的回答之一。我只想在一个方面抛出两分钱:在SQL表设计中表达子类的问题。

如果您在“泛化专业化关系建模”上进行网络搜索,您将获得有关子类化主题的几篇好文章。这是概念数据建模中反复出现的问题。遗憾的是,数据库新手的课程不经常包含这个主题。

相关问题