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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как обеспечить уникальность текстовых blob-полей? 
:(
    Опции темы
Чoо
Дата 17.8.2010, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

на всякий случай, сообщаю, что в этом поле текста будет существенно меньше 32 КБайт. 

впринципе вижу и второй вариант, формировать SQL запрос:
Код

select case when exists (select null from TBL T 
                             where T.BLOBFIELD = 'какой-то текст')
                  then 1 else 0  end 
          FIND
from TBL

но в этом случае:
1. Надо передавать текст на сервер, что бы проверить есть ли такой
2. Надо еще раз передавать, если его все-таки нет
3. Сервер в поисках блоб-поля будетп росматривать все записи с первой до тех пор, пока не закончатся все записи или не будет найден такой же текст. 
Вобщем как-то неоптимально.. 
Посоветуйте что-нибудь?


--------------------
user posted image

OS: Debian Squeeze (kernel 3.8.2)
IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2
PM MAIL   Вверх
Frees
Дата 17.8.2010, 21:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

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



а зачем именно Blob может Varchar и уникальный индекс по этому полю


Цитата(Чoо @  17.8.2010,  23:36 Найти цитируемый пост)
вычисленную пользовательским приложением, контрольную сумму. Если запись удалась, то можно записывать и блоб-поле, если нет, то текущая запиь не является уникальной, о чем сообщается пользователю.

у контрольной суммы могут быть коллизии...


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
Чoо
Дата 17.8.2010, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Frees, коллизий боюсь.. да.. а varchar не утраивает тем, что при кодировке win1251 уникальный индекс можно будеть создать, только если строка будет иметь длину не больше 252 символов (252 байта). в firebird 1.5 вроде такое ограничение. использую 2.1, но по этому поводу ни какой информации не нашел.
Хоть я и использую эту кодировку, мне 252 символов точно мало.

Это сообщение отредактировал(а) Чoо - 17.8.2010, 21:17


--------------------
user posted image

OS: Debian Squeeze (kernel 3.8.2)
IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2
PM MAIL   Вверх
Frees
Дата 17.8.2010, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

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



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

или через Check

Код

CREATE TABLE TABLE1 (
    ID  INTEGER,
    BLOB_FIELD        BLOB SUB_TYPE 1 SEGMENT SIZE 16384
);

ALTER TABLE TABLE1 ADD CHECK (not exists(select * from TABLE1 w where w.BLOB_FIELD = new.BLOB_FIELD));


Добавлено через 5 минут и 11 секунд
если через чек то в случае повтора будет исключение, если через сохраненку то можно сделать, что бы она просто возвращала вставлена или нет запись.

Добавлено через 8 минут и 40 секунд
Цитата(Чoо @  17.8.2010,  23:36 Найти цитируемый пост)
Первое, что приходит в голову, это добавить в таблицу поле blobCRC (unique) в которое перед записью текстового блоб-поля пытаться записать вычисленную пользовательским приложением, контрольную сумму. Если запись удалась, то можно записывать и блоб-поле, если нет, то текущая запиь не является уникальной, о чем сообщается пользователю.

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




--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
Чoо
Дата 17.8.2010, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Frees, вариант с check для многопользовательской среды не годится (читаю в книге Хеллен Борри, стр. 314: 
Цитата

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

А что вы понимаете под сохраненкой?

Добавлено через 1 минуту и 17 секунд
Цитата(Frees @  17.8.2010,  21:48 Найти цитируемый пост)
вообще хорошая идея, только помимо crc еще хранить длину текста тогда вероятность коллизии буде стремиться к 0.

однако хоть и не большая, но есть вероятность коллизии. все-таки это неприемлимо.


--------------------
user posted image

OS: Debian Squeeze (kernel 3.8.2)
IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2
PM MAIL   Вверх
Deniz
Дата 18.8.2010, 07:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

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



Чoо, гарантированную уникальность обеспечит только уникальный индекс, никакие триггеры, чеки, процедуры и т.д. тут не помогут.
Сл-но, смотрим по каким типам полей (и размеру) можно сделать такой индекс.
Получаем, что нужен какой-то алгоритм, который гарантировано для blob сделает уникальную строчку (желательно не сильно длинную).
Вот и все, копайте в сторону 
Цитата(Чoо @  17.8.2010,  22:36 Найти цитируемый пост)
добавить в таблицу поле blobCRC (unique)
.
А вот реализация добавления/изменения такой пары (blob + blobCRC), это на любителя.


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
Akella
Дата 18.8.2010, 09:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


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

Репутация: 20
Всего: 329



Цитата(Чoо @  17.8.2010,  21:16 Найти цитируемый пост)
не больше 252 символов

читай RN, на сколько мне известно, то уже больше

Добавлено через 1 минуту и 43 секунды
Цитата(Frees @  17.8.2010,  21:48 Найти цитируемый пост)
вообще хорошая идея, только помимо crc еще хранить длину текста тогда вероятность коллизии буде стремиться к 0.

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

Добавлено через 2 минуты и 9 секунд
А если уж длина совпала, то тогда и значение поля можно проверять.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Interbase"
Alex

Обязательно указание:

1. Версию InterBase (Firebird, Yaffil)

2. Способа доступа (ADO, BDE, IBX и т.д.)

  • КАК ПРАВИЛЬНО ОФОРМИТЬ КОД - ЗДЕСЬ
  • КАК ПРАВИЛЬНО УКАЗАТЬ ТЕКСТ ОШИБКИ - ЗДЕСЬ
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • FAQ раздела лежит здесь!

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

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


 




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


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

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