Sql 一个面向对象的程序员怎样才能理解数据库驱动的编程呢?

Sql 一个面向对象的程序员怎样才能理解数据库驱动的编程呢?,sql,linq,database-design,oop,Sql,Linq,Database Design,Oop,我已经用C#和Java编程一年多了,对面向对象编程有相当的了解,但我的新项目需要一个数据库驱动的模型。我正在使用C#和Linq,这似乎是一个非常强大的工具,但我在围绕我的面向对象方法设计数据库时遇到了麻烦 我的两个主要问题是: 如何处理数据库中的继承? 假设我正在构建一个员工排班应用程序,我有一个抽象类Event。从事件中,我派生了抽象类ShifteEvent和StaffeEvent。然后我有了具体的类Shift(派生自shifteevent)和StaffTimeOff(派生自staffeeve

我已经用C#和Java编程一年多了,对面向对象编程有相当的了解,但我的新项目需要一个数据库驱动的模型。我正在使用C#和Linq,这似乎是一个非常强大的工具,但我在围绕我的面向对象方法设计数据库时遇到了麻烦

我的两个主要问题是:

如何处理数据库中的继承? 假设我正在构建一个员工排班应用程序,我有一个抽象类Event。从事件中,我派生了抽象类ShifteEvent和StaffeEvent。然后我有了具体的类Shift(派生自shifteevent)和StaffTimeOff(派生自staffeevent)。还有其他派生类,但为了便于讨论,这些已经足够了

我应该有一张单独的桌子来放换档孔和工作人员孔吗?也许我应该为每个具体的课程设置单独的表格?这两种方法在与数据库交互时似乎都会给我带来问题。另一种方法是使用一个事件表,该表将为我的任何具体类中的每种类型的数据提供可为空的列。所有这些方法都会阻碍扩展性的发展。很可能还有第三种方法我没有考虑过

我的第二个问题:

如何以面向对象的方式处理集合和一对多关系?

假设我有一个Products类和一个Categories类。类别的每个实例将包含一个或多个产品,但产品本身不应了解类别。如果我想在数据库中实现这一点,那么每个产品都需要一个category ID,该ID映射到categories表。但从OO的角度来看,这引入了更多的耦合。产品甚至不应该知道类别存在,更不用说有一个包含类别ID的数据字段了!有更好的方法吗?

框架,例如

  • 冬眠
  • JPA

  • 可以帮助您顺利解决这个继承问题。e、 g.

    使用每类表解决方案Linq到SQL:

    其他解决方案(如我最喜欢的LLBLGen)允许使用其他模型。就个人而言,我喜欢带有鉴别器列的单表解决方案,但这可能是因为我们经常跨继承层次结构进行查询,因此将其视为普通查询,而查询特定类型只需要“where”更改

    不管怎么说,我个人觉得将OO映射到表是本末倒置。不断有人声称OO和关系之间的阻抗失配问题已经得到解决。。。而且已经有很多面向对象的数据库。他们中没有一个人能够摆脱这种关系的强大的简单性


    相反,我倾向于在设计数据库时考虑到应用程序,将这些表映射到实体并从那里构建。有些人认为这是设计过程中OO的缺失,但在我看来,数据层对应用程序的影响不应该太高,以至于影响到高阶系统的设计,因为您使用了关系模型进行存储。

    我的猜测是:

    关于继承的主题,我建议有3个表:Event、ShiftEvent和staffeevent。事件的公共数据元素与最初的定义类似


    我想最后一个可以走另一条路。您可以有一个包含类别ID和产品ID的表,其中没有其他列,对于给定的类别ID,该表将返回产品,但产品可能不需要获取类别作为其描述本身的一部分。

    最大的问题是:您如何才能了解它?只是需要练习。您尝试实现一个数据库设计,遇到设计问题,重构,并记住下一次哪些有效,哪些无效

    要回答您的具体问题。。。这是在“我将如何做”中提出的一点意见,没有考虑性能需求等。我总是从完全标准化开始,然后根据真实世界的测试开始:

    Table Event
    EventID
    Title
    StartDateTime
    EndDateTime
    
    Table ShiftEvent
    ShiftEventID
    EventID
    ShiftSpecificProperty1
    
    ...
    
    Table Product
    ProductID
    Name
    
    Table Category
    CategoryID
    Name
    
    Table CategoryProduct
    CategoryID
    ProductID
    

    再次重申Pierre所说的——像Hibernate这样的ORM工具可以更好地处理关系结构和OO结构之间的摩擦。

    将继承树映射到关系模型有多种可能性。 例如,NHibernate支持“每个类的表层次结构”、每个子类的表和每个具体类的表策略:

    关于第二个问题: 您可以在数据库中创建1:n关系,其中Products表当然有Categories表的外键。 但是,这并不意味着您的产品类需要引用它所属的类别实例。 您可以创建一个Category类,其中包含一组或一组产品,也可以创建一个product类,它不知道它所属的类别。 同样,您可以使用(N)Hibernate轻松完成这项工作;

    听起来你好像发现了问题所在

    产品甚至不应该知道这一点 类别是存在的,更不用说有一个 包含类别ID的数据字段

    我不同意这一点,我认为与其提供类别id,不如让orm为您提供。然后在代码中,您会有如下内容(借用NHib和Castle的ActiveRecord):

    然后,如果你想看看你的产品属于哪一类,你可以做一些简单的事情,比如:

    Product.ParentCategory
    
    我想你可以用不同的方式设置orm,但不管是哪种方式,对于继承问题,我都会问…你为什么在意?要么使用对象,忘掉数据库,要么用另一种方式。可能看起来很傻,但除非你真的不能拥有一大堆桌子,或者出于某种原因不想要一张桌子,否则你为什么要关心d
    class Product
      [BelongsTo]
      Category ParentCategory {get;set;}
    
    Product.ParentCategory