ОО Дизайн против Базы данных Дизайн - PullRequest
5 голосов
/ 16 июня 2009

Предположим, я разрабатываю приложение для дистрибьютора продуктов на 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 и выполнять операции CRUD, проверяя их типы с помощью as/is операторов?

Или что еще я могу сделать? Есть предложения?

Ответы [ 7 ]

5 голосов
/ 16 июня 2009

Во-первых, если вы создали один класс TransactionDA и проверили типы внутри класса для выполнения операций CRUD, вы нарушили бы Принцип открытия / закрытия , поэтому я бы определенно не пошел по этому пути.

Что касается предложений о том, как выполнить построение DAL, я бы посоветовал следить за некоторыми сообщениями в блогах о людях, которые намного умнее меня, о том, что они думают об этой теме.

Хранилище - новый синглтон

Хранилище мертво: Да здравствует репозиторий

Ночь живых хранилищ

Разговор, я полагаю, продолжается, но это должно помочь вам начать.

3 голосов
/ 16 июня 2009

Я бы использовал ORM, такой как NHibernate, и использовал бы его возможности наследования нескольких таблиц, и тогда мне не пришлось бы беспокоиться об этом самостоятельно.

3 голосов
/ 16 июня 2009

Я бы использовал здесь подтипы сущностей. Создайте одну таблицу для транзакций (и, как сказал более ранний автор, возможно, лучше использовать другой термин) и сохраните там все, что часто встречается. Затем создайте одну таблицу «подтип» для каждой специализации. Эти таблицы подтипов должны иметь тот же первичный ключ, что и основная таблица («сильная» сущность) и поля, которые являются уникальными для этой конкретной специализации. Каждый подтип относится к сильной сущности взаимно-однозначно с необязательным участием на стороне подтипа и обязательным участием на стороне сильной сущности.

Затем, чтобы упростить запросы, определите представление, которое (внешний) объединяет сильную сущность со всеми подтипами сущности, чтобы вы могли легко «увидеть» все.

Вот простой (и общий) пример того, как это настроить:

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
)  
2 голосов
/ 16 июня 2009

Вы можете использовать внедрение зависимостей, создать класс DA для каждого и заставить их всех реализовывать один и тот же интерфейс ITransactionDA с вашими операциями CRUD.

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

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

Stock stock = new Stock(new StockDA());
2 голосов
/ 16 июня 2009

Если вы знаете, что ваши данные собираются в три отдельные таблицы, то у меня обычно было бы три отдельных класса DA.

Однако, если ваши таблицы практически одинаковы, вы можете обобщить TransactionDA и упростить уровень данных. Я сделал бы это только в том случае, если вы знаете, что у вас будет большой объем транзакций и вы собираетесь разделять ваши таблицы на разные файлы или что-то в этом роде, в противном случае я бы, вероятно, просто упростил бы все и соединил все это.

Не пытайтесь создать TransactionDA, если все ваши отдельные типы транзакций крайне не похожи.

0 голосов
/ 16 июня 2009

Я сделаю что-то подобное

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
{
}
0 голосов
/ 16 июня 2009
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...