Каким количеством бизнес-логика должна быть в базе данных?

Я думаю, AWK - лучшая и эффективная команда для решения вашей проблемы. AWK включен по умолчанию почти во все дистрибутивы Linux.

echo "bla@some.com;john@home.com" | awk -F';' '{print $1,$2}'

даст

bla@some.com john@home.com

Конечно, вы можете сохранить каждый адрес электронной почты, переопределив поле печати awk.

9
задан Clijsters 17 July 2017 в 17:56
поделиться

11 ответов

Если вам не нужна массовая распределенная масштабируемость (подумайте о компаниях с таким объемом трафика, как Amazon или Facebook и т. Д.), То модели реляционной базы данных, вероятно, будет достаточно для удовлетворения ваших потребностей в производительности. В этом случае использование реляционной модели с первичными ключами, внешними ключами, ограничениями и транзакциями значительно упрощает поддержание целостности данных и сокращает объем необходимых согласований (и поверьте мне, как только вы перестанете использовать какие-либо из этих вещей вам потребуется согласование - даже с ними вы, вероятно, столкнетесь из-за ошибок).

Однако большую часть кода проверки намного проще написать на таких языках, как C #, Java, Python и т. д., чем на таких языках, как SQL, потому что это ' это тип вещей, для которых они созданы. Это включает в себя такие вещи, как проверка форматов строк, зависимостей между полями и т. Д. Поэтому я бы предпочел делать это в «нормальном» коде, а не в базе данных.

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

d, как правило, делает это в «нормальном» коде, а не в базе данных.

Это означает, что прагматическое решение (и, конечно, то, которое мы используем) - это написать код там, где это имеет смысл. Позвольте базе данных обрабатывать целостность данных, потому что это то, в чем она хороша, и пусть «нормальный» код обрабатывает достоверность данных, потому что это то, в чем он хорош. Вы найдете массу случаев, когда это не так, и когда имеет смысл делать что-то в разных местах, поэтому просто будьте прагматичны и взвешивайте это в каждом конкретном случае.

d, как правило, делает это в «обычном» коде, а не в базе данных.

Это означает, что прагматическое решение (и, конечно, то, которое мы используем) - это написать код там, где это имеет смысл. Позвольте базе данных обрабатывать целостность данных, потому что это то, в чем она хороша, и пусть «нормальный» код обрабатывает достоверность данных, потому что это то, в чем он хорош. Вы найдете массу случаев, когда это не так, и когда имеет смысл делать что-то в разных местах, поэтому просто будьте прагматичны и взвешивайте это в каждом конкретном случае.

код обрабатывает достоверность данных, потому что это то, в чем он хорош. Вы найдете массу случаев, когда это не так, и когда имеет смысл делать что-то в разных местах, поэтому просто будьте прагматичны и взвешивайте это в каждом конкретном случае.

код обрабатывает достоверность данных, потому что это то, в чем он хорош. Вы найдете массу случаев, когда это не так, и когда имеет смысл делать что-то в разных местах, поэтому будьте прагматичны и взвешивайте это в каждом конкретном случае.

13
ответ дан 4 December 2019 в 10:05
поделиться

I find that you need to validate in both the front end (either the GUI client, if you have one, or the server) and the database.

The database can easily assert for nulls, foreign key constraints etc. i.e. that the data is the right shape and linked up correctly. Transactions will enforce atomic writes of this. It's the database's responsibility to contain/return data in the right shape.

The server can perform more complex validations (e.g. does this look like an email, does this look like a postcode etc.) and then re-structure the input for insertion into the database (e.g. normalise it and create the appropriate entities for insertion into the tables).

Where you put the emphasis on validation depends to some degree on your application. e.g. it's useful to validate a (say) postcode in a GUI client and immediately provide feedback, but if your database is used by other applications (e.g. an application to bulkload addresses) then your layer surrounding the database needs to validate as well. Sometimes you end up providing validation in two different implementations (e.g. in the above, perhaps a Javascript front-end and a Java DAO backend). I've never found a good strategic solution to this.

3
ответ дан 4 December 2019 в 10:05
поделиться

Два цента: если вы выберете умный, не забудьте не вводить в поле «слишком умный». База данных не должна иметь дело с несоответствиями, которые не соответствуют ее уровню понимания данных.

Пример: предположим, вы хотите вставить действительный (проверенный с помощью письма с подтверждением) адрес электронной почты в поле. База данных может проверить, действительно ли электронное письмо соответствует заданному регулярному выражению, но запрашивать у базы данных проверку правильности адреса электронной почты (например, проверка существования домена, отправка электронного письма и обработка ответа) - это слишком.

Это не реальный пример. Просто чтобы проиллюстрировать вам, что умная база данных в любом случае имеет ограничения в ее интеллектуальности, и если в нее попадает несуществующий адрес электронной почты, данные все равно недействительны, но для базы данных все в порядке. Как и в модели OSI, все должно обрабатывать данные на своем уровне понимания. Ethernet не волнует, передает ли он ICMP или TCP, действительны они или нет.

3
ответ дан 4 December 2019 в 10:05
поделиться

Использование общих функций реляционных баз данных, таких как ограничения первичного и внешнего ключей, объявления типов данных и т. Д., Является разумным. Если вы не собираетесь их использовать, зачем возиться с реляционной БД?

Тем не менее, все данные должны быть проверены как для типа, так и для бизнес-правил, прежде чем попадут в базу данных. Проверка типа - это просто защитное программирование: предположим, что пользователи хотят вас взломать, и тогда вы получите меньше неприятных сюрпризов. Бизнес-правила - это то, о чем ваше приложение. Если вы сделаете их частью структуры своей базы данных, они станут гораздо более тесно связаны с тем, как работает ваше приложение. Если вы поместите их на уровень приложения, их будет легче изменить при изменении бизнес-требований.

В качестве второстепенного соображения: у клиентов часто меньше выбора, какую базу данных они использовать (postgresql, mysql, Oracle, и т. д.), чем язык приложения, который они имеют. Поэтому, если есть большая вероятность, что ваше приложение будет установлено во многих различных системах, лучше всего убедиться, что ваш SQL является как можно более стандартным. Это может означать, что создание не зависящих от языка функций БД, таких как триггеры и т. Д., Будет сложнее, чем размещение той же логики на уровне вашего приложения.

1
ответ дан 4 December 2019 в 10:05
поделиться

Это зависит от приложения :)

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

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

Тем не менее, если ваше новое приложение похоже на предыдущее, я бы выбрал тупой база данных. Чтобы исключить все ручные проверки и код доступа к базе данных, я бы предложил использовать библиотеку ORM , такую ​​как Hibernate для Java. Это существенно автоматизирует ваш уровень доступа к данным, но оставит всю логику вашему приложению.

Что касается проверки, она должна выполняться на всех уровнях. Для получения более подробной информации см. Другие ответы.

1
ответ дан 4 December 2019 в 10:05
поделиться

Еще один важный момент - развертывание. У нас есть приложение, в котором развертывание изменений базы данных на самом деле проще для удаленных установок, чем реальная база кода. По этой причине мы поместили много кода приложения в хранимые процедуры и функции базы данных.

Развертывание не является вашим приоритетом №1, но оно может сыграть важную роль в принятии решения относительно различных вариантов

1
ответ дан 4 December 2019 в 10:05
поделиться

Это вопрос как людей, так и технологий. Если ваше приложение - единственное приложение, которое когда-либо будет манипулировать данными (что случается редко, даже если вы думаете, что это план), и у вас есть только кодеры приложений под рукой, то непременно сохраните всю логику в

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

Однако помните, что лучше всего проверять базу данных: а) типы данных и б) реляционные ограничения, которые все, что называет РСУБД, в любом случае должно быть обработано.

Если вы "у вас есть транзакции в коде вашего приложения, это" Также стоит спросить себя, должны ли они быть помещены в базу данных в качестве хранимой процедуры, чтобы их нельзя было неправильно реализовать где-либо еще.

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

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

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

1
ответ дан 4 December 2019 в 10:05
поделиться

e.g. When a user is going to save some data he just entered. Should the application just send the data to the database and the database decides if the data is valid? Or should the application be the smart part in the line and check if the data is OK?

Its better to have the validation in the front end as well as the server side. So if the data is invalid the user will be notified immediately. Otherwise he will have to wait for the DB to respond after a post back.

When security is concerned its better to validate at both the ends. Front end as well as DB. Or how can the DB trust all the data that is sent by the application ;-)

0
ответ дан 4 December 2019 в 10:05
поделиться

Хотя я считаю, что большинство данных следует проверять из пользовательского интерфейса (зачем отправлять заведомо плохие вещи по сети, связывающие ресурсы?), я также считаю безответственным не накладывать ограничения на базу данных, поскольку пользовательский интерфейс вряд ли будет единственным способом, которым данные когда-либо попадут в базу данных. Данные также поступают из импорта, других приложений, быстрых исправлений скриптов для проблем, запускаемых в окне запроса, запуска массовых обновлений (например, для обновления всех цен на 10%). Я хочу, чтобы все плохие записи отклонялись независимо от их источника, а база данных - единственное место, где вы можете быть уверены, что это произойдет.

1
ответ дан 4 December 2019 в 10:05
поделиться

Validation should be done on the client-side and server side and once it valid then it should be stored.

The only work that the database should do is any querying logic. So update rows, inserting rows, selects and everything else should be handled by the server side logic since thats where the real meat of the application lives.

Structuring your insert properly will handle any foreign Key constraints. Getting your business logic to call a sproc will insert data in the correct format. I don't really consider this validation but some people might.

-1
ответ дан 4 December 2019 в 10:05
поделиться

Мое решение: никогда не использовать хранимые процедуры в базе данных. Хранимая процедура не переносима.

-2
ответ дан 4 December 2019 в 10:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: