【问题标题】:OO Design vs Database DesignOO 设计与数据库设计
【发布时间】:2009-06-16 12:20:23
【问题描述】:

假设我正在用 C# 为产品分销商开发一个应用程序。

分销商进行以下 3 种类型的交易:

(1) 缩进

(2) 卖出

(3) 库存

我的课程设计如下:

public abstract class Transaction
{
}

public class Indent : Transaction
{
}

public class Sell : Transaction
{
}    

public class Stock : Transaction
{
}

现在如果我想将这三种类型的信息保存在三个单独的表中,那么我应该如何设计我的 DA 层?

我是否应该像

那样构建单独的 DA 类
(1) IndentDA
(2) SellDA
(3) StockDA

或单个类 TransactionDA 并通过使用 as/is 运算符检查其类型来执行 CRUD 操作?

或者我还能做什么?有什么建议吗?

【问题讨论】:

  • 我不会使用 TRanasction 作为实体名称;可能会导致混乱......
  • 取决于 DA 类中方法的相似程度。您在 DA 中使用了哪些方法?

标签: c# oop n-tier-architecture


【解决方案1】:

首先,如果您创建了单个类 TransactionDA 并检查了类中的类型以执行 CRUD 操作,那么您将违反 Open/Closed Principle,所以我绝对不会走这条路。

关于如何完成构建 DAL 的建议,我建议关注一些关于比我聪明得多的人对这个主题的看法的博客文章。

Repository is the new Singleton

Repository is Dead: Long Live Repository

Night of the Living Repositories

我相信对话仍在继续,但这应该让你开始。

【讨论】:

    【解决方案2】:

    我会使用像 NHibernate 这样的 ORM 并使用它的多表继承功能,然后我自己就不用担心了。

    【讨论】:

      【解决方案3】:

      我会在这里使用实体子类型。为交易创建一个表(正如之前的海报所说,也许不同的术语会更好)并在那里存储所有常见的东西。然后为每个专业创建一个“子类型”表。这些子类型表应具有与主表(“强”实体)相同的主键以及该特定专业化唯一的字段。每个子类型与强实体一一对应,子类型端可选参与,强实体端需要参与。

      然后,为了使查询更容易,定义一个(外部)将强实体与所有实体子类型连接起来的视图,以便您可以轻松“查看”所有内容。

      下面是一个简单(常见)的设置示例:

      create table Employee (
        eid        int primary key,
        first_name text,
        last_name  text not null
      )
      
      create table Salaried (
        eid             int primary key,
        annualSalaryUSD money not null
      )
      
      create table Hourly (
        eid             int primary key,
        hourlyRateUSD   money not null
      )  
      

      【讨论】:

        【解决方案4】:

        如果您知道您的数据将进入三个单独的表,那么我通常会有三个单独的 DA 类。

        但是,如果您的表几乎完全相同,那么您可以通用化 TransactionDA 并简化您的数据层。只有当您知道您将有大量事务并且要将表分离到不同的文件或其他东西时,我才会这样做,否则我可能只会简化事情并将它们组合起来。

        除非所有单独的交易类型都非常相似,否则不要尝试创建 TransactionDA。

        【讨论】:

          【解决方案5】:

          您可以使用依赖注入,为每个创建一个 DA 类,并让它们都使用您的 CRUD 操作实现相同的接口 ITransactionDA。

          public interface ITransactionDA
          {
            void Read();
            void Update();
          ...
          }
          
          public class StockDA : ITransactionDA
          {
            //implement interface methods
          }
          
          Stock stock = new Stock(new StockDA());
          

          【讨论】:

            【解决方案6】:

            我会做类似的事情

            public abstract class DistributerTransaction
            {
                DistributerDA dataaccess;
            }
            public class Indent : DistributerTransaction
            {
            }
            public class Sell : DistributerTransaction
            {
            }
            public class Stock : DistributerTransaction
            {
            }
            
            public abstract class DistributerDA
            {
               /*Read();
                 Update();*/
            }
            public class IndentDA : DistributerDA
            {
            }
            public class SellDA : DistributerDA
            {
            }
            public class StockDA : DistributerDA
            {
            }
            

            【讨论】:

              【解决方案7】:

              【讨论】:

                猜你喜欢
                • 2011-01-16
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-12-15
                • 1970-01-01
                相关资源
                最近更新 更多