2015-06-15 6 views
1
class Customer 
{ 
    public int Id { get; set; } 
} 

class Sale 
{ 
    public int Id { get; set; } 
    public int CustomerId { get; set; } 
} 

class SaleService 
{ 

    public void NewSale(Sale sale) 
    { 
     //Should i validate if Customer exists by sale.CustomerId before call save? 

     saleRepository.InsertOrUpdate(sale); 
    } 
} 

Я использую конструкцию и структуру сущностей, управляемую доменами. Должен ли я проверять, существует ли клиент, продавая его. Клиент раньше, чем позвонить?Должен ли я проверить, существует ли связанная сущность перед вставкой?

ответ

2

Обычно я этого не делаю. Обычно эта информация поступает от клиента, который был загружен раньше (он существовал). Однако есть случаи, когда CustomerId отсутствует во время обновления вашего db.

  • Из-за параллелизма, когда многие пользователи одновременно пользуются системой. Но этот случай должен быть решен выборочно с использованием оптимистического контроля параллелизма (версия). Обычно мы не пытаемся обрабатывать параллелизм во всех случаях, так как это практически невозможно сделать, и это также имеет побочные эффекты, такие как проблемы с производительностью, сложность, ... Мы фокусируемся только на некотором критическом коде в системе, который может вызвать проблемы если есть проблема параллелизма.

  • Клиент пытается взломать систему, отправив неуместное CustomerId. Но это еще одна проблема, которая должна быть проверена на основе авторизации или что-то в этом роде.

В большинстве случаев, я думаю, что ограничение внешнего ключа в db достаточно.

+1

Что относительно распределенных систем? – plalx

+2

@plalx: что вы имеете в виду распределенные системы: распределенные базы данных или распределенные серверы приложений? В случае распределенных серверов приложений не должно быть никакой разницы, потому что запрос от каждого сервера не должен отличаться от точки зрения сервера db –

+0

Представьте, что Пользователь делает продажу и выбранного клиента. Другой пользователь удалил клиента, выбранного первым пользователем. Когда первый пользователь пытается сохранить, генерируется ошибка внешнего ключа. Думая об этом, чтобы свести к минимуму случаи, я думал, что добавлю «удаленный» столбец вместо удаления записей. Это будет подходящая практика? Побочным эффектом является то, что мне пришлось бы создавать отфильтрованные индексы к уникальным столбцам. –

Смежные вопросы