在尝试理解程序对象与表格中的数据之间的相关性(这里:OO program and SQL database)时,我仍然不太了解,对于是否可以使用SQL表达了强烈的意见分歧db用于存储OO程序的数据。
对于新程序员,是否可以/推荐?
如果没有,OO程序的替代方案是程序性程序吗?
此外,我不理解 Object-relational impedance mismatch ,这是人们的意思,当他们说“使用SQL DB存储数据不合适”时对于一个OO程序“:有人可以总结它,还是有一个简单的例子来说明它?
答案 0 :(得分:3)
对于新程序员,是否可以/推荐?
这个问题意味着系统设计/组件/架构被选择/旨在使程序员受益。
相反,我更喜欢选择设计/组件/架构以使系统(以及系统的所有者,用户和操作员)受益,并确保程序员知道(可能需要他们进行一些学习或培训)需要以发展该系统。
事实是:
如果没有,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表设计中表达子类的问题。
如果您在“泛化专业化关系建模”上进行网络搜索,您将获得有关子类化主题的几篇好文章。这是概念数据建模中反复出现的问题。遗憾的是,数据库新手的课程不经常包含这个主题。