2013-07-05 4 views
0

В настоящее время я поддерживаю довольно большое офисное веб-приложение. Недавно мне стало известно, что с помощью различных инструментов разработчика в веб-браузерах значения выборочных боксов могут быть легко изменены пользователем (между прочим). На стороне сервера я выполняю проверку, если опубликованные данные являются численными или нет (для выпадающих списков), но на самом деле не проверяют, существует ли это значение в таблице базы данных, например, у меня есть раскрывающийся список для приветствия ('mr ',' ms ',' mrs ',' Mr/ms ') и т. д., которые соответствуют числовым значениям.Ссылочная целостность для mysql

В настоящее время я использую MyISAM таблицы MySQL, которые не предлагают внешние ключи ссылочной целостности, так что я имею в виду, о переезде в Innodb, но это обладать следующий вопрос:

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

Мои вопросы:

1) при использовании ссылочной целостности, не столбцы действительно должны быть проиндексированы также?

2) Есть ли другие практические решения, которые я могу игнорировать? (Например, использовать отдельный запрос для каждого выпадающего-списка, чтобы увидеть, существует ли значение в таблице?)

3) Как и другие веб-приложения справиться с такими проблемами?

Помогите оценить!

благодаря Patrick

ответ

1

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

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

+0

Привет, Спасибо за быстрый ответ :-) Моих считает, что MyISAM таблица не выполняет такую ​​проверку, вы можете в основном вставку вставить любое значение, которое определяется как «внешний ключ». Также я понимаю, что индексирование следует применять редко; только когда это необходимо для повышения производительности, с столбцами, которые приводят к высокой мощности. – user2022678

+0

да, это правда. myisam анализирует/принимает заявления внешнего ключа, но они в основном молча игнорируются и определенно НЕ применяются. и нет, эмпирическое правило для индексов - применять их к любому полю, используемому в ситуации where/join/order или other «test the value». –

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

    Как уже упоминалось @MarcB в своем ответе, InnoDB использует эти индексы, чтобы ссылочная целостность проверяет более эффективной при некоторых типах данных изменений. Эти изменения включают в себя обновление или удаление значений в родительской таблице и каскадные операции.

  2. Вы можете использовать ENUM data type ограничить столбец фиксированного набора значений. Но ENUMhas some disadvantages тоже.

  3. Некоторые веб-разработчики избегают внешних ключей. Чтобы обеспечить одинаковые гарантии целостности данных, они должны написать код приложения для каждого такого случая. Поэтому, если вам нравится писать и тестировать много повторяющегося кода, излишне дублирующие функции, которые RDBMS уже обеспечивает более эффективно, тогда идите вперед! :-)

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

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

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