Я читал книгу "Enterprise Rails" Дэна Чака, и это заставило меня задуматься: считаете ли вы, что у вас должны быть ограничения данных как на уровне базы данных, так и на уровне приложений? Или вы чувствуете себя так же, как и устойные структуры, такие как Ruby on Rails - база данных - это просто "немой репозиторий" для данных, и все проверки должны выполняться в вашем приложении (я не пытаюсь выделить RoR здесь - я огромный поклонник Rails, но я не согласен с его подходом к базе данных)?
Лично я считаю, что вы должны иметь их обоих, чтобы убедиться, что ваша база данных и приложение хорошо защищены. Я имею в виду, что вы должны использовать ненулевые ограничения, дайте своим полям длину, если она известна (в отличие от оставления их всех в nvarchar (255)), имеют такие вещи, как Внешние ключи Проверить ограничения и Триггеры в вашей базе данных, а затем также применять это в соответствии с правилами бизнес-логики в вашем приложении. IMO делает ваше приложение надежным через свой пользовательский интерфейс, а также защищает от того, кто может иметь прямой доступ к базе данных.
Контр-аргумент, который я чаще всего вижу, заключается в том, что он требует того, что дублирует логику; один раз на уровне базы данных и один раз на уровне приложения. Скажем, у вас есть проверочное ограничение, чтобы проверить, что SKU продукта введен (т.е. длина больше нуля).
Теперь вам нужно также включить методы проверки в бизнес-логику, чтобы убедиться, что введенное пользователем значение имеет длину больше нуля, а также, возможно, некоторый Javascript на стороне клиента, чтобы поймать ошибку, поскольку пользователь вводит данные.
Я для одного не вижу в этом ничего плохого - да, у вас есть повторяющаяся логика, но конечным результатом является мышление "база данных как крепость", поскольку, если вы думаете об этом, ваши данные являются самой важной частью ваше приложение; в конце концов, какая польза от вашего блестящего нового приложения Web 2.0, если данные могут быть легко повреждены и скомпрометированы?
Что вы думаете об этом? Должна ли база данных быть непроницаемой крепостью, такой как Форт-Нокс, или открытым сейфом, охраняемым лазерами? Другими словами, следует ли жертвовать некоторым дублированием логики для обеспечения надежной модели данных или оставить все в своем приложении и использовать базу данных просто для хранения данных?