Ошибки в разработке баз данных, сделанные разработчиками приложений [закрыто]

Он не может обрабатывать пакетную обработку (используя для разделения нескольких операторов), поскольку для этого требуется двухсторонняя связь. Я боюсь, что вам нужно сделать это в цикле и переходить в базу данных несколько раз.

На самом деле я никогда не мог использовать пакетную обработку с любым управляемым провайдером.

566
задан 12 revs, 6 users 40% 13 September 2010 в 19:19
поделиться

25 ответов

1. Не использование соответствующих индексов

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

2. Не осуществление ссылочной целостности

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

Довольно распространено видеть этот отказ на базах данных MySQL. Я не полагаю, что MyISAM поддерживает его. InnoDB делает. Вы найдете людей, которые используют MyISAM или тех, которые используют InnoDB, но не используют его так или иначе.

Больше здесь:

3. Используя естественные а не суррогатные (технические) первичные ключи

Естественные ключи являются ключами на основе внешне значимых данных, которые (якобы) уникальны. Типичными примерами являются коды продуктов, двухбуквенные коды состояния (США), номера социального страхования и так далее. Суррогатные или технические первичные ключи - те, которые не имеют абсолютно никакого значения вне системы. Они изобретены просто для идентификации объекта и обычно автоувеличивают поля (SQL Server, MySQL, другие) или последовательности (прежде всего Oracle).

По-моему, необходимо всегда использовать суррогатные ключи. Эта проблема подошла в этих вопросах:

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

Помните, даже страны могут прекратить существование (например, Югославия).

4. Запись запрашивает, которые требуют DISTINCT работать

Вы часто видите это в ORM-сгенерированных запросах. Посмотрите на вывод журнала от, в спящем режиме, и Вы будете видеть, что все запросы начинаются:

SELECT DISTINCT ...

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

От того, почему я ненавижу ОТЛИЧНЫЙ:

Где вещи начинают идти на спад, по-моему, когда разработчик создает существенный запрос, присоединяясь к таблицам вместе, и внезапно он понимает, что похоже, что он получает дубликат (или еще больше) строки и его непосредственный ответ... его "решение" этой "проблемы" состоит в том, чтобы бросить на ОТЛИЧНОЕ ключевое слово, и ПУФ все его проблемы уходят.

5. Одобрение агрегирования по соединениям

Другая частая ошибка разработчиками приложения базы данных не состоит в том, чтобы понять сколько еще дорогое агрегирование (т.е. GROUP BY пункт), может сравниться с соединениями.

Для давания Вам общее представление о том, насколько широко распространенный это я несколько раз писал по этой теме здесь и был downvoted много для него. Например:

От SQL-оператора - “присоединяются” по сравнению с “группой и наличием”:

Первый запрос:

SELECT userid
FROM userrole
WHERE roleid IN (1, 2, 3)
GROUP by userid
HAVING COUNT(1) = 3

Время запроса: 0,312 с

Второй запрос:

SELECT t1.userid
FROM userrole t1
JOIN userrole t2 ON t1.userid = t2.userid AND t2.roleid = 2
JOIN userrole t3 ON t2.userid = t3.userid AND t3.roleid = 3
AND t1.roleid = 1

Время запроса: 0,016 с

Верно. Версия соединения, которую я предложил, в двадцать раз быстрее, чем совокупная версия.

6. Не упрощение сложных запросов посредством представлений

Не все представления поддержки поставщиков базы данных, но для тех, которые делают, они могут значительно упростить запросы, если используется рассудительно. Например, на одном проекте я использовал универсальную модель Party для CRM. Это - чрезвычайно мощный и гибкий метод моделирования, но может привести ко многим соединениям. В этой модели были:

  • Сторона: люди и организации;
  • Партийная Роль: вещи те стороны сделали, например, Сотрудник и Работодатель;
  • Партийные Ролевые Отношения: как те роли, связанные друг с другом.

Пример:

  • Ted является Человеком, будучи подтипом Стороны;
  • У Ted есть много ролей, одна из которых является Сотрудником;
  • Intel является организацией, будучи подтипом Стороны;
  • Intel имеет много ролей, одна из которых является Работодателем;
  • Intel нанимает Ted, подразумевая, что существуют отношения между их соответствующими ролями.

Таким образом, существует пять таблиц, соединенных для соединения Ted с его работодателем. Вы предполагаете, что все сотрудники являются Людьми (не организации) и обеспечивают это представление помощника:

CREATE VIEW vw_employee AS
SELECT p.title, p.given_names, p.surname, p.date_of_birth, p2.party_name employer_name
FROM person p
JOIN party py ON py.id = p.id
JOIN party_role child ON p.id = child.party_id
JOIN party_role_relationship prr ON child.id = prr.child_id AND prr.type = 'EMPLOYMENT'
JOIN party_role parent ON parent.id = prr.parent_id = parent.id
JOIN party p2 ON parent.party_id = p2.id

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

7. Не очистка входа

Это - огромное. Теперь мне нравится PHP, но если Вы не знаете то, что Вы делаете, действительно легко создать сайты, уязвимые для нападения. Ничто не подводит итог его лучше, чем история маленького Bobby Tables.

Данные, обеспеченные пользователем посредством URL, данных формы и cookie, нужно всегда рассматривать как враждебные и санированные. Удостоверьтесь, что Вы получаете то, что Вы ожидаете.

8. Не использование подготовленных операторов

Подготовленные операторы - при компиляции запроса минус данные, используемые во вставках, обновлениях и WHERE пункты и затем предоставляют это позже. Например:

SELECT * FROM users WHERE username = 'bob'

по сравнению с

SELECT * FROM users WHERE username = ?

или

SELECT * FROM users WHERE username = :username

в зависимости от Вашей платформы.

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

Используя подготовленные операторы также даст Вам значимую статистику о том, как часто используются определенные запросы.

Подготовленные операторы также лучше защитят Вас от атак с использованием кода на SQL.

9. Не нормализация достаточно

Нормализация базы данных является в основном процессом оптимизации проектирования баз данных или как Вы организуете свои данные в таблицы.

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

Это также предстало в Лучшем методе перед хранением списка идентификаторов пользователей:

Я видел в других системах, что список хранится в сериализированном массиве PHP.

Но отсутствие нормализации прибывает во многие формы.

Еще:

10. Нормализация слишком много

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

Я когда-то работал над системой, которая имела огромную иерархию для клиентов, которые пошли что-то как:

Licensee ->  Dealer Group -> Company -> Practice -> ...

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

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

Еще:

11. Используя эксклюзивные дуги

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

От практического руководства по дизайну реляционной базы данных:

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

12. Не выполнение анализа производительности запросов вообще

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

13. Чрезмерная зависимость от ОБЪЕДИНЕНИЯ ВСЕ и особенно конструкции ОБЪЕДИНЕНИЯ

ОБЪЕДИНЕНИЕ в терминах SQL просто связывает конгруэнтные наборы данных, означая, что у них есть тот же тип и число столбцов. Различие между ними - то, что ОБЪЕДИНЕНИЕ ВСЕ - простая конкатенация и должно быть предпочтено везде, где возможный, тогда как ОБЪЕДИНЕНИЕ неявно сделает ОТЛИЧНОЕ для удаления дублирующихся кортежей.

ОБЪЕДИНЕНИЯ, как ОТЛИЧНЫЙ, имеют свое место. Существуют действительные приложения. Но если Вы делаете многие из них, особенно в подзапросах, затем Вы, вероятно, делаете что-то не так. Это могло бы быть случаем плохой конструкции запроса или плохо разработанной модели данных, вынуждающей Вас сделать такие вещи.

ОБЪЕДИНЕНИЯ, особенно при использовании в соединениях или зависимых подзапросах могут нанести вред базе данных. Старайтесь избегать их, когда это возможно.

14. Используя ИЛИ условия в запросах

Это могло бы казаться безопасным. В конце концов, ANDs в порядке. ИЛИ должен быть в порядке слишком правильный? Неправильно. В основном И условие ограничивает набор данных, тогда как ИЛИ условие выращивает его, но не способом, который предоставляет себя оптимизации. Особенно, когда различное ИЛИ условия могли бы пересечь таким образом принуждение оптимизатора к эффективно к ОТЛИЧНОЙ операции на результате.

Плохо:

... WHERE a = 2 OR a = 5 OR a = 11

Лучше:

... WHERE a IN (2, 5, 11)

Теперь Ваш оптимизатор SQL может эффективно превратить первый запрос во второе. Но это не могло бы. Просто не делайте этого.

15. Не разработка их модели данных для кредитования себя высокопроизводительным решениям

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

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

Преждевременная оптимизация является корнем всего зла

16. Неправильное использование Транзакций базы данных

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

Идеально, самый простой способ достигнуть этого состоит в том, что все проектирование системы должно стремиться поддерживать все изменения данных через сингл, ВСТАВЛЯТЬ/ОБНОВЛЯТЬ/ОПЕРАТОРЫ УДАЛЕНИЯ. В этом случае никакая специальная обработка транзакции не необходима, как Ваш механизм базы данных должен сделать так автоматически.

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

  • Начните Транзакцию перед первым оператором.
  • Фиксируйте Транзакцию после последнего оператора.
  • На любой ошибке, Откат Транзакция. И очень NB! Не забывайте пропускать/прерывать все операторы, которые следуют после ошибки.

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

17. Не понимание 'основанной на наборе' парадигмы

Язык SQL следует за определенной парадигмой, подходящей для определенных видов проблем. Различные определенные для поставщика расширения, несмотря на это, язык изо всех сил пытается иметь дело с проблемами, которые тривиальны в языках как Java, C#, Delphi и т.д.

Это отсутствие понимания проявляется несколькими способами.

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

Определите ясное подразделение ответственности и стремитесь использовать соответствующий инструмент для решения каждой проблемы.

1002
ответ дан 22 November 2019 в 22:11
поделиться

1 - Излишне использование функции на значении в, где пункт с результатом того индекса, не используясь.

Пример:

where to_char(someDate,'YYYYMMDD') between :fromDate and :toDate

вместо

where someDate >= to_date(:fromDate,'YYYYMMDD') and someDate < to_date(:toDate,'YYYYMMDD')+1

И до меньшей степени: Не добавление функциональных индексов к тем значениям, которым нужны они...

2 - Не добавляющие проверочные ограничения для обеспечения законности данных. Ограничения могут использоваться оптимизатором запросов, и они ДЕЙСТВИТЕЛЬНО помогают удостовериться, что можно доверять инвариантам. Нет только никакой причины не использовать их.

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

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

4 - не так о базе данных по сути, но действительно раздражающий. Не заботясь о качестве кода SQL. То, что Ваш SQL выражается в тексте, не делает его хорошо для сокрытия логики в "куче" алгоритмов обработки строк. Совершенно возможно записать SQL в тексте способом, который на самом деле читаем Вашим коллегой - программистом.

8
ответ дан 4 revs, 3 users 80% 14 September 2010 в 06:19
поделиться
  • 1
    Что, если запись является каталогом? – fastcodejava 8 June 2011 в 22:40

Не использование параметризированных запросов. Они довольно удобны в остановке Внедрение SQL .

Это - определенный пример не очистки входных данных, упомянутых в другом ответе.

13
ответ дан Ash 14 September 2010 в 06:19
поделиться
  • 1
    Временный пароль должен также быть хешем SHA1. Как это - дыра? – Steve Wortham 3 June 2009 в 22:50
3
ответ дан Charles Faiga 14 September 2010 в 06:19
поделиться
  • 1
    Вы могли объяснить больше, что Вы подразумеваете под этим , необходимо ли все еще выйти, если Вы встраиваете в другие типы строки включая HTML . , Вы подразумеваете, что я не должен выходить из имен пользователей и электронных писем, которые я поместил в свой дб, когда я использую подготовленные операторы? - я только показываю имя пользователя для пользователя в HTMLL, взятом от дб. Ваш ответ предлагает меня, что мне нужно к pg_espace_string к именам пользователей. – Léo Léopold Hertz 준영 22 August 2009 в 17:37

Ключевое проектирование баз данных и программирующие ошибки, сделанные разработчиками

  • Эгоистичное проектирование баз данных и использование. Разработчики часто рассматривают базу данных как свое персональное хранилище постоянного объекта, не рассматривая потребности других заинтересованных сторон в данных. Это также относится к архитекторам приложения. Плохое проектирование баз данных и целостность данных мешают третьим лицам, работающим с данными, и могут существенно увеличить затраты жизненного цикла системы. Создание отчетов и MIS имеет тенденцию быть бедным родственником в проектировании приложений и только сделанный машинально.

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

  • Испуганный из записи SQL. SQL не является аэрокосмическими исследованиями и на самом деле довольно хорош в выполнении его задания. Отображающиеся слои O/R довольно хороши в выполнении 95% запросов, которые просты и соответствуют хорошо той модели. Иногда SQL является лучшим способом сделать задание.

  • Догматичный 'Никакие Хранимые процедуры' политики. Независимо от того, верите ли Вы, хранимые процедуры являются злыми, этот вид догматического отношения не имеет никакого места на проекте программного обеспечения.

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

110
ответ дан 3 revs, 2 users 93% 14 September 2010 в 06:19
поделиться
  • 1
    @Charlie I don' t думают, что это верно. Если я использую PeaZip для извлечения zip, которая имеет структуру каталогов в нем, получающемуся каталогу воссоздали структуру папок правильно. Этот метод (это кажется), получает все файлы, неважно, что их структура каталогов, и просто помещает их в основной целевой каталог. – NeilMonday 18 August 2011 в 13:53

a) Запрос жесткого кодирования оценивает в строке
b) Помещение базы данных запрашивает код в действии "OnButtonPress" в приложении Windows Forms

Я видел обоих.

4
ответ дан 22 November 2019 в 22:11
поделиться

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

4
ответ дан 22 November 2019 в 22:11
поделиться
  1. Не используя управление версиями на схеме базы данных
  2. Работа непосредственно против живой базы данных
  3. Не читая и понимающий более усовершенствованные понятия базы данных (индексы, кластерные индексы, ограничения, осуществили представления, и т.д.),
  4. При отказе протестировать на масштабируемость... данные тестирования только 3 или 4 строк никогда не будут давать Вам реальное изображение реального живого выступления
80
ответ дан 22 November 2019 в 22:11
поделиться

Злоупотребление и/или зависимость от хранимых процедур.

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

Хранимые процедуры полезны, где было на самом деле доказано, что некоторый реальный технический фактор требует их использования (например, производительность и безопасность), Например, сохраняя агрегирование/фильтрацию больших наборов данных "близко к данным".

Я недавно должен был помочь поддержать и улучшить большое настольное приложение Delphi, которого 70% бизнес-логики и правил были реализованы в 1400 хранимые процедуры SQL Server (остаток в обработчиках событий UI). Это было кошмаром, прежде всего, из-за difficuly представления тестирования годного изделия к TSQL, отсутствию инкапсуляции и плохих инструментов (Отладчики, редакторы).

Работа с командой Java в прошлом, я быстро узнал, что часто полное противоположное содержит в той среде. Архитектор Java однажды сказал мне: "База данных для данных, не кодируют"..

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

46
ответ дан 22 November 2019 в 22:11
поделиться

Проблема номер один? Они только тестируют на игрушечных базах данных. Таким образом, они понятия не имеют, что их SQL проверит, когда база данных станет большой, и кто-то должен приехать и зафиксировать его позже (которые звучат, можно услышать, мое зубное шлифование).

41
ответ дан 22 November 2019 в 22:11
поделиться

Не использование индексов.

31
ответ дан 22 November 2019 в 22:11
поделиться

По моему опыту:
Не общение с опытным DBAs.

21
ответ дан 22 November 2019 в 22:11
поделиться

Используя Доступ вместо "реальной" базы данных. Существует много больших маленьких и даже свободных баз данных как SQL Express, MySQL и SQLite, который будет работать и масштабироваться намного лучше. Приложения часто должны масштабироваться неожиданными способами.

17
ответ дан 22 November 2019 в 22:11
поделиться

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

16
ответ дан 22 November 2019 в 22:11
поделиться

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

8
ответ дан 22 November 2019 в 22:11
поделиться

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

8
ответ дан 22 November 2019 в 22:11
поделиться
  • Отклонению ORM нравится, в спящем режиме из руки, по причинам как "он является слишком волшебным" или "не на моей базе данных".
  • Надежде слишком в большой степени на ORM нравится, в спящем режиме и пробующий к рожку для обуви это в том, где это не является соответствующим.
8
ответ дан 22 November 2019 в 22:11
поделиться

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

Полагая, что это вздор о преждевременной оптимизации. Базы данных должны учитывать производительность в исходном дизайне и в любой последующей разработке. На мой взгляд, производительность составляет 50% дизайна базы данных (40% - целостность данных, а последние 10% - безопасность). Базы данных, которые не создаются снизу вверх для работы, будут плохо работать, если реальные пользователи и реальный трафик будут помещены в базу данных. Преждевременная оптимизация не означает отсутствие оптимизации! Это не означает, что вы должны писать код, который почти всегда будет плохо работать, потому что вам это будет проще (например, курсоры, которые никогда не должны быть разрешены в производственной базе данных, если все остальное не помогло). Это означает, что вы не Не нужно думать о том, чтобы выжать из них последнюю каплю производительности, пока это не понадобится. Много известно о том, что будет лучше работать с базами данных, и игнорировать это при проектировании и разработке в лучшем случае недальновидно.

14
ответ дан 22 November 2019 в 22:11
поделиться

Об этом говорилось ранее, но: индексы, индексы, индексы . Я видел так много случаев неэффективной работы корпоративных веб-приложений, которые можно было исправить, просто выполнив небольшое профилирование (чтобы увидеть, какие таблицы были сильно загружены), а затем добавив индекс для этих таблиц. Это даже не требует больших знаний в области написания SQL, а отдача огромна.

Избегайте дублирования данных, как чумы. Некоторые считают, что небольшое дублирование не повредит и улучшит производительность. Эй, я не говорю, что вам нужно замучить свою схему до третьей нормальной формы, пока она не станет настолько абстрактной, что даже администраторы баз данных не узнают, что происходит. Просто поймите, что всякий раз, когда вы дублируете набор имен, почтовых индексов или кодов доставки, копии со временем БУДУТ рассинхронизированы друг с другом. Это случится. И тогда вы будете пинать себя, выполняя еженедельный сценарий обслуживания.

И, наконец, используйте четкое, последовательное, интуитивно понятное соглашение об именах. Точно так же, как хорошо написанный фрагмент кода должен быть читаемым, хорошая схема или запрос SQL должны быть читаемыми и практически сообщать вам, что он делает, даже без комментариев. Вы будете благодарить себя через шесть месяцев, когда вам придется обслуживать столы. «ВЫБРАТЬ номер_аккаунта, дата_поста из национальных_аккаунтов» бесконечно легче работать, чем «ВЫБРАТЬ ACCNTNBR, BILLDAT FROM NTNLACCTS».

интуитивно понятное соглашение об именах. Точно так же, как хорошо написанный фрагмент кода должен быть читаемым, хорошая схема SQL или запрос должны быть читаемыми и практически сообщать вам, что он делает, даже без комментариев. Вы будете благодарить себя через шесть месяцев, когда вам придется обслуживать столы. «ВЫБРАТЬ номер_аккаунта, дата биллинга ИЗ национальных_аккаунтов» бесконечно проще работать, чем «ВЫБРАТЬ ACCNTNBR, BILLDAT FROM NTNLACCTS».

интуитивно понятное соглашение об именах. Точно так же, как хорошо написанный фрагмент кода должен быть читаемым, хорошая схема или запрос SQL должны быть читаемыми и практически сообщать вам, что он делает, даже без комментариев. Вы будете благодарить себя через шесть месяцев, когда вам придется обслуживать столы. «ВЫБРАТЬ номер_аккаунта, дата_поста из национальных_аккаунтов» бесконечно легче работать, чем «ВЫБРАТЬ ACCNTNBR, BILLDAT FROM NTNLACCTS».

7
ответ дан 22 November 2019 в 22:11
поделиться

Не выполнять соответствующий SELECT-запрос перед выполнением DELETE-запроса (особенно на производственных базах данных)!

6
ответ дан 22 November 2019 в 22:11
поделиться

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

3
ответ дан 22 November 2019 в 22:11
поделиться

Использование Excel для хранения (огромных объемов) данных.

Я видел компании, хранящие тысячи строк и использующие несколько рабочих листов (из-за ограничения строк в 65535 в предыдущих версиях Excel).


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

14
ответ дан 22 November 2019 в 22:11
поделиться

Обвинение механизма дб, когда запрос, который выполнил sooo быстро на аварийных завершениях машины разработки и дросселе, после того как Вы бросаете некоторый трафик в приложение.

2
ответ дан 22 November 2019 в 22:11
поделиться
  • Очень большие транзакции, вставляя/обновляя много данных и затем перезагружая его. В основном это - до не рассмотрения пользовательской среды работы базы данных в.

  • Злоупотребление функциями, конкретно как результаты в выборах и в где пункты, который заставляет функцию быть вызванной и снова для результатов. Это, я думаю, соответствия под общим случаем того, что они пытались работать процедурным способом, к которому они больше привыкли, а не используют SQL для в полной мере.

2
ответ дан 22 November 2019 в 22:11
поделиться

Я мог бы добавить одну вещь: научиться использовать аналитические функции, такие как PARTITION BY, RANK, DENSE_RANK (для Oracle). Они абсолютно необходимы для сложных запросов.

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

1
ответ дан 22 November 2019 в 22:11
поделиться
Другие вопросы по тегам:

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