面向对象设计与数据库设计

5
假设我正在使用C#为一个产品分销商开发应用程序。
该分销商进行以下三种类型的交易:
(1) 订单
(2) 销售
(3) 库存
我按照以下方式设计我的类:
public abstract class Transaction
{
}

public class Indent : Transaction
{
}

public class Sell : Transaction
{
}    

public class Stock : Transaction
{
}

如果我想将这三种类型的信息保存在三个不同的表中,那么我的数据访问层应该如何设计呢?
我需要建立独立的数据访问类,例如:
(1) IndentDA
(2) SellDA
(3) StockDA

我可以使用单个类TransactionDA,通过使用as/is运算符检查它们的类型来执行CRUD操作吗?

还是说还有其他什么建议吗?


4
我不会把"Transaction"作为实体名称;这可能会导致混淆... - Mitch Wheat
取决于DA类中的方法有多相似。您在DA中使用哪些方法? - Paco
7个回答

5

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
)  

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

2

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

public interface ITransactionDA
{
  void Read();
  void Update();
...
}

public class StockDA : ITransactionDA
{
  //implement interface methods
}

Stock stock = new Stock(new StockDA());

2
如果你知道你的数据要分别存储在三个表中,那么通常会有三个不同的DA类。然而,如果你的表结构基本相同,那么你可以将TransactionDA泛化,并简化你的数据层。我只会在你知道会有大量事务和需要将表分开存储到不同文件中时这样做,否则我可能会简化所有内容并将其组合起来。除非你的所有单独事务类型都非常相似,否则不要试图创建一个TransactionDA。

0

我会做类似那样的事情

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
{
}

-6

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