Модераторы: LSD
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Надежность MySQL 
:(
    Опции темы
slang
Дата 15.8.2005, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 455
Регистрация: 7.3.2004

Репутация: нет
Всего: 0



Какой вариант работы лучше выбрать? Чтобы операции выполнялись и контролировались средствами СУБД, которые можно выполнить и контролировать с ее помощью. Или же средствами PHP. В последнем случае, безусловно снижается быстродействие и значительно увеличивается нагрузка на сервер приложений. В первом случае повышается нагрузка на БД.
Однозначно, выход из строя СУБД - может привести к более тригическим последствиям, нежели временная недоступность скриптов. Но насколько велика вероятность значительного повышения нагрузки на СУБД в следующем случае:
Существует таблица из трех столбцов: field_1, field_2, field_3.
Необходимо производить контроль, чтобы сочетание field_2 и field_3 не повторялось. На уровне СУБД это можно сделать
Код

UNIQUE ( `field_2` , `field_3` )

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


--------------------
Запчасти на иномарки www.avtograd55.ru.
Если есть время - зайдите и посоветуйте что исправить и что доработать.
PM MAIL WWW ICQ   Вверх
Ignat
Дата 15.8.2005, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

Репутация: нет
Всего: 73



Полный запрос приведи, пожалуйста. И не проще ли изначально выставить уникальный индекс?


--------------------
Теперь при чем :P
PM   Вверх
Akina
Дата 15.8.2005, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 13
Всего: 454



Контроль средствами БД всегда надежнее контроля средствами клиента. А трагические последствия из-за "выхода из строя сервера СУБД" не зависят от того, где выполняется контроль, они зависят исключительно от грамотности организации резервногокопирования. если оно вообще есть.
ИМХО.

PS. На 99% уверен, что сервер MySQL и веб-сервер физически располагаются на одной машине - если так, то вопрос (вернее ссылки на нагрузку отдельного процесса) вообще лишен смысла.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Mal Hack
Дата 15.8.2005, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: нет
Всего: 261



Это все пошло отсюда: http://forum.vingrad.ru/index.php?showtopic=61443&hl=
PM ICQ   Вверх
LSD
Дата 20.8.2005, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 24
Всего: 538



Цитата(Akina @ 15.8.2005, 17:35)
Контроль средствами БД всегда надежнее контроля средствами клиента.

Полностью согласен.

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


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
SergeBS
Дата 23.8.2005, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1111
Регистрация: 10.6.2005
Где: Владимир

Репутация: 1
Всего: 22



LSD
На клиенте это делать неправильно, поскольку клиент может стать и другим. Сделает какой-нибудь Вася Пупкин мелкую приладу для просмотра и редактирования маленького интересного ему кусочка - и привет.
Тут вы с Akina правы.
Специально для поддержки сложных бизнес-правил созданы триггеры и хранимые процедуры. Тут - бизнес-правило. Так зачем запросы приплетать? "Непрофильное" применение.
Индексом контролировать неприятно - гарантировано притормаживание на любых операциях изменения таблицы. И неудобно. Они не для этого. Даже уникальные.
PM MAIL   Вверх
LSD
Дата 23.8.2005, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 24
Всего: 538



Цитата(SergeBS @ 23.8.2005, 11:53)
Индексом контролировать неприятно - гарантировано притормаживание на любых операциях изменения таблицы. И неудобно. Они не для этого. Даже уникальные.

А как контролировать уникальность?
Может какие БД и делают это иначе, но для Oracle верно:
Цитата
Alternatively, you can define UNIQUE integrity constraints on the desired columns. Oracle enforces UNIQUE integrity constraints by automatically defining a unique index on the unique key. However, it is advisable that any index that exists for query performance, including unique indexes, be created explicitly.



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Bikutoru
Дата 23.8.2005, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлекающийся
**


Профиль
Группа: Участник
Сообщений: 522
Регистрация: 24.5.2005
Где: Москва

Репутация: нет
Всего: 22



Цитата
Специально для поддержки сложных бизнес-правил созданы триггеры и хранимые процедуры. Тут - бизнес-правило. Так зачем запросы приплетать? "Непрофильное" применение.

Поправьте меня, если я не прав, но ни хранимых процедур, ни триггеров MySQL не имеет. Так что альтернативы только две:
1. делать SELECT перед каждым UPDATE/INSERT;
2. использовать уникальный индекс.



--------------------
Человек, словно в зеркале мир — многолик, 
Он ничтожен — и он же безмерно велик!
Омар Хайям
PM   Вверх
SergeBS
Дата 31.8.2005, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1111
Регистрация: 10.6.2005
Где: Владимир

Репутация: 1
Всего: 22



Bikutoru
Цитата
Поправьте меня, если я не прав, но ни хранимых процедур, ни триггеров MySQL не имеет.


Поправляю smile
MySQL 5.0.2 (дождались-таки!)

Цитата

Chapter 19. Stored Procedures and Functions
Stored procedures and functions are a new feature in MySQL version 5.0. A stored procedure is a set of SQL statements that can be stored in the server. Once this has been done, clients don't need to keep reissuing the individual statements but can refer to the stored procedure instead.
...

Цитата

Chapter 20. Triggers
Rudimentary support for triggers is included beginning with MySQL 5.0.2. A trigger is a named database object that is associated with a table and that activates when a particular event occurs for the table.
...


Так что способов хватает:
№1,№2 - см. выше.

LSD
Если с нормальностью базы у тебя нормально smile (т.е. до 3 НФ довел), то уникальный индекс = уникальному полю.

Более понятно - я излагал про уникальные индексы по _нескольким_полям_. Они неудобны. Ну вылетело исключение по неуникальности - гадай, в каком поле неверный ввод. И чеши репу насчет исправления ситуации заодно.
А если индекс по одному уникальному полю - так все разруливается легко и просто.
Пока правильно поле не заполнено - не выпускать из него, а в качестве угрозы "Щас всю запись коцну, если по-хорошему не понимаешь!"
И производительность, и поиск - все люкс в качестве бонуса smile.

PM MAIL   Вверх
LSD
Дата 31.8.2005, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 24
Всего: 538



Цитата(SergeBS @ 31.8.2005, 13:00)
Если с нормальностью базы у тебя нормально  (т.е. до 3 НФ довел), то уникальный индекс = уникальному полю.

Ну тогда вопрос как реализовать такую штуку: есть список объектов, и есть список состояний для этих объектов. Объекту на определенный момент времениможно назначить, определенное действие, но только одно, или вообще ничего не назначать. С уникальностью по двум полям это делается элементарно: таблица [TIMESTAMP, OBJ_ID, ACT_ID] и ставим уникальный индекс на колонки [DATE, OBJ_ID] (а лучше первичный ключ).

Цитата(SergeBS @ 31.8.2005, 13:00)
Более понятно - я излагал про уникальные индексы по _нескольким_полям_. Они неудобны. Ну вылетело исключение по неуникальности - гадай, в каком поле неверный ввод. И чеши репу насчет исправления ситуации заодно.

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


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
SergeBS
Дата 5.9.2005, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1111
Регистрация: 10.6.2005
Где: Владимир

Репутация: 1
Всего: 22



LSD
[/quote]
В том то и дело что неверные данные во всех полях, т.к. уникальность определяется по все полям сразу.
[quote]
Не бывает.
1 решение: для каждого объекта определяешь список допустимых возможных состояний. Т.е. либо для каждого объекта - свой справочник состояний, либо для каждого состояния - куча (1..N) логических полей, определяющих, может i-й объект из всего N объектов находиться в этом состоянии или нет. Что лучше - зависит от степени перекрытия сосотояний у разных объектов.
Если у объекта 2 взаимно влияющих поля действий - у действий 2-мерная матрица M*N где M - число состояний 1 поля, n - число состояний 2-го, 3 - 3-хмерная аналогично. И т.д. Это решение "в лоб".

Другое решение (для хорошо алгоритмируемых условий): на ввод любого поля - триггер.
В триггере урезаешь список возможного ввода для остальных полей.

3 решение: а-ля мастер/волшебник. Очередность ввода полей жестко задана. По 1-му введенному определяется набор возможных значений для 2-го, после ввода 2-го - для 3-го и т.д.
4 решение: с реляционной СУБД - на иерархическую/древовидную - по сути тот же мастер ввода, где структура связей узел-листья задает возможный выбор.


PM MAIL   Вверх
LSD
Дата 5.9.2005, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 24
Всего: 538



Цитата(SergeBS @ 5.9.2005, 14:12)
Не бывает.

Не понял, не бывает чего?

Цитата(SergeBS @ 5.9.2005, 14:12)
1 решение: для каждого объекта определяешь список допустимых возможных состояний. Т.е. либо для каждого объекта - свой справочник состояний, либо для каждого состояния - куча (1..N) логических полей, определяющих, может i-й объект из всего N объектов находиться в этом состоянии или нет. Что лучше - зависит от степени перекрытия сосотояний у разных объектов.
Если у объекта 2 взаимно влияющих поля действий - у действий 2-мерная матрица M*N где M - число состояний 1 поля, n - число состояний 2-го, 3 - 3-хмерная аналогично. И т.д. Это решение "в лоб".

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

Цитата(SergeBS @ 5.9.2005, 14:12)
Другое решение (для хорошо алгоритмируемых условий): на ввод любого поля - триггер.
В триггере урезаешь список возможного ввода для остальных полей.

Что такое триггер на поле?


Цитата(SergeBS @ 5.9.2005, 14:12)
3 решение: а-ля мастер/волшебник. Очередность ввода полей жестко задана. По 1-му введенному определяется набор возможных значений для 2-го, после ввода 2-го - для 3-го и т.д.
4 решение: с реляционной СУБД - на иерархическую/древовидную - по сути тот же мастер ввода, где структура связей узел-листья задает возможный выбор.

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

Например еще одна задачка, есть таблица в которой хранятся табличные значения некой функции (пусть она будет от 3-х аргументов), соответсвенно для каждой тройки [X,Y,Z] должно быть только одно значение.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
SergeBS
Дата 6.9.2005, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1111
Регистрация: 10.6.2005
Где: Владимир

Репутация: 1
Всего: 22



LSD
Цитата

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

Не бывает по определению. Любая запись по определению уникальна, если взять все поля. Формулирую определение по-другому: в БД отсутствуют одинаковые записи.

Цитата

Что такое триггер на поле?

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

Цитата

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

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

Цитата

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

А откуда ты берешь ограничения целостности? С потолка? Тогда и здесь с потолка.
И это не столько интерфейс, сколько способ _последовательного_ввода_ с проверкой на каждом этапе. Интерфейс определяется задачей.

Цитата

Например еще одна задачка, есть таблица в которой хранятся табличные значения некой функции (пусть она будет от 3-х аргументов), соответсвенно для каждой тройки [X,Y,Z] должно быть только одно значение.


А подумать самому? Тебе еще раз повторить? Ну на:
Другое решение (для хорошо алгоритмируемых условий): на ввод любого поля - попытка update - триггер.
В триггере урезаешь список возможного ввода для остальных полей.
Чем урезать, объяснять? Без проблем: см. выше насчет потолка и селекта smile.
Если способен получить только триаду значений сразу - тогда просто откат с воплем: "юзер, не пихай лажу!". Все равно другого ничего не сможешь.


PM MAIL   Вверх
LSD
Дата 6.9.2005, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 24
Всего: 538



Цитата(SergeBS @ 6.9.2005, 12:00)
Не бывает по определению. Любая запись по определению уникальна, если взять все поля. Формулирую определение по-другому: в БД отсутствуют одинаковые записи.

1. Это откуда такое определение интерестно? И вообще что ты понимаешь под уникальностью, различимость записей для СУБД или различимость для клиента?
2. Я говорил про все поля входящие в уникальный индекс.

Цитата(SergeBS @ 6.9.2005, 12:00)
При вводе любого из критичных полей - сразу попытка обновить - триггер на обновление.

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

Цитата(SergeBS @ 6.9.2005, 12:00)
Вот и впихни в триггер этот селект.
Я что, твою задачу лучше тебя знаю? Ты ее вообще не изложил.

Ты просто не удосужился прочитать.
Цитата(LSD @ 31.8.2005, 13:32)
есть список объектов, и есть список состояний для этих объектов. Объекту на определенный момент времениможно назначить, определенное действие, но только одно, или вообще ничего не назначать. С уникальностью по двум полям это делается элементарно: таблица [TIMESTAMP, OBJ_ID, ACT_ID] и ставим уникальный индекс на колонки [DATE, OBJ_ID] (а лучше первичный ключ).

А свою задачу я и без тебя решу, не переживай smile


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
SergeBS
Дата 6.9.2005, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1111
Регистрация: 10.6.2005
Где: Владимир

Репутация: 1
Всего: 22



LSD
Экий ты нудный.

Цитата

Любая запись по определению уникальна, если взять все поля. Формулирую определение по-другому: в БД отсутствуют одинаковые записи.

1. Это откуда такое определение интерестно?


Например:
Цитата

Введение в базы данных
Алексей Федоров, Наталия Елманова
...
Первая нормальная форма
Чтобы таблица соответствовала первой нормальной форме, все значения ее полей должны быть атомарными, и все записи — уникальными. Поэтому любая реляционная таблица, по определению, уже находится в первой нормальной форме.

Риордан не цитирую. Дейта тоже. "Проще надо быть, проще" smile.

Цитата

А с insert что делать? И вообще, ты представляешь как увеличится нагрузка на базу, если запись обновлять не целиком а по одному полю (при условии что полей много).

А еще delete бывает. Излагалась идея - как можно сделать. На insert тоже триггер можно навесить, тот же самый. Добавлю оттуда же (см.выше):
Цитата

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

В переводе на практику: если у тебя много полей зависит друг от друга - значит БД не нормализована. Нормализуй. В результате может, конечно получиться что-то типа - из 1 таблицы с N полями получаем N/2 таблиц с 2-мя полями в каждой, но тогда задача - не для реляционной базы, а для иерархической. Типа деревце вверх ногами smile. С веточками и листиками.

Цитата

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

Если сумеешь сделать так, чтобы триггер таблицы в одной транзакции работал, а другую игнорировал, это будет НЕЧТО! Триггер на таблице висит. Срабатывает от события таблицы, неважно кто это событие вызвал.

Цитата

Ты просто не удосужился прочитать.

Можешь ткнуть пальцем в _определение_уникальности ? Не в то, что ты потребовал уникального сочетания 2-х полей, а в то, которое нужно получить?
Ладно. Проехали. smile Поскольку
Цитата

А свою задачу я и без тебя решу, не переживай



PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Общие вопросы по базам данных"
LSD
Zloxa

Данный форум предназначен для обсуждения вопросов о базах данных не попадающих под тематику других форумов:

  • вопросам по СУБД для которых нет отдельных подфорумов
  • вопросам которые затрагивают несколько разных СУБД (например проблема выбора)
  • инструменты для работы с СУБД
  • вопросы проектирования БД
  • теоретически вопросы о СУБД

Данный форум не предназначен для:

  • вопросов о поиске разлиных БД (если не понимаете чем БД отличается от СУБД то: а) вам не сюда; б) Google в помощь)
  • обсуждения проблем с доступом к СУБД из различных ЯП (для этого есть соответсвующие форумы по каждому ЯП)
  • обсуждения проблем с написание SQL запросов, для этого есть форум Составление SQL-запросов
  • просьб о написании курсовой, реферата и т.п., для этого есть Центр помощи или фриланс биржа
  • объявлений о найме специалистов, для этого есть раздел Объявления о найме специалистов

Если вы не соблюдаете эти правила, не удивляйтесь потом не найдя свою тему/сообщение. ;)


Полезные советы:

При написании сообщения постарайтесь дать теме максимально понятное название. В теме максимально подробно опишите проблему. Если применимо укажите: название базы данных и версии (MySQL 4.1, MS SQL Server 2000 и т.п.); используемых язык программирования; способа доступа (ADO, BDE и т.д.); сообщения об ошибках.

Для вставки кода используйте теги [code=sql] [/code].

Литературу по базам данных можно поискать здесь.

Действия модераторов можно обсудить здесь.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, LSD, Zloxa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | СУБД, общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0660 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.