Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Как хранить длинные строки? / 20 сообщений из 20, страница 1 из 1
11.01.2014, 17:09:03
    #38523012
Занудов
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как хранить длинные строки?
Есть небольшая база Firebird 1.5 в день добавляется примерно ок 20 записей. Появилась потебность хранить в связи один к одному к каждой записи текст, примерно ок. 1000 знаков. Как это дело можно лучше разместить: varchar, blob, внешние файлы? Или еще какие нибудь варианты?
...
Рейтинг: 0 / 0
11.01.2014, 17:17:45
    #38523017
kgb ussr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как хранить длинные строки?
Вот эта фразу разъясни:
Занудов...Появилась потебность хранить в связи один к одному к каждой записи текст, примерно ок. 1000 знаков...
...
Рейтинг: 0 / 0
11.01.2014, 17:19:41
    #38523021
Занудов
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как хранить длинные строки?
kgb ussrВот эта фразу разъясни:
Занудов...Появилась потебность хранить в связи один к одному к каждой записи текст, примерно ок. 1000 знаков...
А что тут непонятного? Связи?
...
Рейтинг: 0 / 0
11.01.2014, 17:23:45
    #38523025
kgb ussr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как хранить длинные строки?
Занудовkgb ussrВот эта фразу разъясни:
пропущено...

А что тут непонятного? Связи?
Ну нет так нет. Может, кто-то что-то и понял.
...
Рейтинг: 0 / 0
11.01.2014, 17:25:59
    #38523026
Занудов
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как хранить длинные строки?
kgb ussrЗанудовпропущено...

А что тут непонятного? Связи?
Ну нет так нет. Может, кто-то что-то и понял.
Я интересуюсь у народа, как хранить длинные строки в базе данных( это если проще)
...
Рейтинг: 0 / 0
11.01.2014, 17:30:36
    #38523028
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как хранить длинные строки?
ЗанудовЯ интересуюсь у народа, как хранить длинные строки в базе данных( это если
проще)
Как хочешь так и храни. Каждый способ имеет свои плюсы и минусы.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
11.01.2014, 17:33:39
    #38523031
Занудов
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как хранить длинные строки?
Dimitry SibiryakovЗанудовЯ интересуюсь у народа, как хранить длинные строки в базе данных( это если
проще)
Как хочешь так и храни. Каждый способ имеет свои плюсы и минусы.

Подскажи, какие могут быть минусы при хранении в varchar?
...
Рейтинг: 0 / 0
11.01.2014, 17:38:09
    #38523034
kgb ussr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как хранить длинные строки?
ЗанудовDimitry Sibiryakovпропущено...

Как хочешь так и храни. Каждый способ имеет свои плюсы и минусы.

Подскажи, какие могут быть минусы при хранении в varchar?
Никаких. Сплошные плюсы.
...
Рейтинг: 0 / 0
11.01.2014, 18:07:58
    #38523057
Как хранить длинные строки?
Занудовкакие могут быть минусы при хранении в varchar ?по ср с блобами только один: когда-нибудь не влезет .
...
Рейтинг: 0 / 0
11.01.2014, 18:11:48
    #38523060
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как хранить длинные строки?
kgb ussrНикаких. Сплошные плюсы.
Ну, для размера в тысячу, пожалуй, да, особо минусов не припоминается.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
11.01.2014, 18:16:26
    #38523063
Занудов
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как хранить длинные строки?
Dimitry Sibiryakovkgb ussrНикаких. Сплошные плюсы.
Ну, для размера в тысячу, пожалуй, да, особо минусов не припоминается.

А при каком размере минусы будут заметны?
...
Рейтинг: 0 / 0
11.01.2014, 18:27:36
    #38523071
WildSery
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как хранить длинные строки?
Занудов,

Тебе ж написали. Когда не влезет в варчар.
...
Рейтинг: 0 / 0
11.01.2014, 18:55:38
    #38523090
Занудов
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как хранить длинные строки?
WildSeryЗанудов,

Тебе ж написали. Когда не влезет в варчар.
Я не про размеры varchar, а про возможные тормоза при выборке из базы.
...
Рейтинг: 0 / 0
11.01.2014, 19:02:30
    #38523096
kgb ussr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как хранить длинные строки?
ЗанудовWildSeryЗанудов,

Тебе ж написали. Когда не влезет в варчар.
Я не про размеры varchar, а про возможные тормоза при выборке из базы.
Что ж тебе надо еще?
...
Рейтинг: 0 / 0
11.01.2014, 19:03:39
    #38523097
Как хранить длинные строки?
ЗанудовЯ не про размеры varchar, а про возможные тормоза при выборке из базы.Искать что-нибудь пробовал (хотя бы тут, на форуме) ? ну, или самому сбацать тест какой - невыносимо больно, что ле ?
...
Рейтинг: 0 / 0
11.01.2014, 21:20:45
    #38523173
PEAKTOP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как хранить длинные строки?
Вот что-то типа универсальной структуры, позволяющей хранить примечания к записям к любой таблице в базе данных.
Примечаний может быть несколько для одной записи.
Если тебе нужно только одно, перепиливай под себя. САМ.


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
CREATE GENERATOR GENR$STR_ID;

CREATE TABLE TABL$STR (
    OBJ_ID       DOMN$PSTRING_50_ID,  -- Имя таблицы, для которой храним строку
    REC_ID       DOMN$PSTRING_50_ID,  -- ID-записи, для которой храним строку
    ID           DOMN$INTEGER_ID, -- Универсальный идентификатор
    NAME         DOMN$PSTRING, -- какое-то примечание к строке. может, тебе не надо.
    DECR         DOMN$BLOB_TEXT, -- сама строка.
    DATE_COMMIT  DOMN$DATETIME, -- дата добавления/изменения записи
    USER_ID      DOMN$PSTRING_50 -- пользователь, последним добавивший или редактировавший строку
);
/******************************************************************************/
/***                              Primary Keys                              ***/
/******************************************************************************/
ALTER TABLE TABL$STR ADD CONSTRAINT C_PK$STR_ID PRIMARY KEY (ID)
USING INDEX INDX$STR_ID;
/******************************************************************************/
/***                                Indices                                 ***/
/******************************************************************************/

CREATE INDEX INDX$STR_DATE_COMMIT ON TABL$STR (DATE_COMMIT);
CREATE INDEX INDX$STR_OBJ_ID ON TABL$STR (OBJ_ID);
CREATE INDEX INDX$STR_REC_ID ON TABL$STR (REC_ID);
CREATE INDEX INDX$STR_USER_ID ON TABL$STR (USER_ID);
/******************************************************************************/
/***                                Triggers                                ***/
/******************************************************************************/
SET TERM ^ ;

CREATE OR ALTER TRIGGER TRIG$STR_ADIU_255 FOR TABL$STR
ACTIVE AFTER INSERT OR UPDATE OR DELETE POSITION 255
AS
BEGIN
   POST_EVENT 'TABL$STR';
END
^
CREATE OR ALTER TRIGGER TRIG$STR_BIU_200 FOR TABL$STR
ACTIVE BEFORE INSERT OR UPDATE POSITION 200
AS
BEGIN
  IF(NEW.DATE_COMMIT IS NULL)THEN NEW.DATE_COMMIT = CURRENT_TIMESTAMP;
  IF(NEW.USER_ID     IS NULL)THEN
    BEGIN
    NEW.USER_ID = RDB$GET_CONTEXT('USER_SESSION', 'DATABASE_USER');
    END
  IF(NEW.USER_ID     IS NULL)THEN
    BEGIN
    NEW.USER_ID = CURRENT_USER;
    END
END
^
CREATE OR ALTER TRIGGER TRIG$STR_BI_000 FOR TABL$STR
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
  NEW.ID = GEN_ID(GENR$STR_ID, 1);
END
^
SET TERM ; ^
COMMIT;

/******************************************************************************/
/***                               Privileges                               ***/
/******************************************************************************/
GRANT UPDATE, REFERENCES ON TABL$STR TO TRIGGER TRIG$STR_ADIU_255;
GRANT UPDATE, REFERENCES ON TABL$STR TO TRIGGER TRIG$STR_BIU_200;
GRANT UPDATE, REFERENCES ON TABL$STR TO TRIGGER TRIG$STR_BI_000;
COMMIT;


...
Рейтинг: 0 / 0
11.01.2014, 21:46:02
    #38523181
Занудов
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как хранить длинные строки?
PEAKTOPВот что-то типа универсальной структуры, позволяющей хранить примечания к записям к любой таблице в базе данных.
Примечаний может быть несколько для одной записи.
Если тебе нужно только одно, перепиливай под себя. САМ.


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
CREATE GENERATOR GENR$STR_ID;

CREATE TABLE TABL$STR (
    OBJ_ID       DOMN$PSTRING_50_ID,  -- Имя таблицы, для которой храним строку
    REC_ID       DOMN$PSTRING_50_ID,  -- ID-записи, для которой храним строку
    ID           DOMN$INTEGER_ID, -- Универсальный идентификатор
    NAME         DOMN$PSTRING, -- какое-то примечание к строке. может, тебе не надо.
    DECR         DOMN$BLOB_TEXT, -- сама строка.
    DATE_COMMIT  DOMN$DATETIME, -- дата добавления/изменения записи
    USER_ID      DOMN$PSTRING_50 -- пользователь, последним добавивший или редактировавший строку
);
/******************************************************************************/
/***                              Primary Keys                              ***/
/******************************************************************************/
ALTER TABLE TABL$STR ADD CONSTRAINT C_PK$STR_ID PRIMARY KEY (ID)
USING INDEX INDX$STR_ID;
/******************************************************************************/
/***                                Indices                                 ***/
/******************************************************************************/

CREATE INDEX INDX$STR_DATE_COMMIT ON TABL$STR (DATE_COMMIT);
CREATE INDEX INDX$STR_OBJ_ID ON TABL$STR (OBJ_ID);
CREATE INDEX INDX$STR_REC_ID ON TABL$STR (REC_ID);
CREATE INDEX INDX$STR_USER_ID ON TABL$STR (USER_ID);
/******************************************************************************/
/***                                Triggers                                ***/
/******************************************************************************/
SET TERM ^ ;

CREATE OR ALTER TRIGGER TRIG$STR_ADIU_255 FOR TABL$STR
ACTIVE AFTER INSERT OR UPDATE OR DELETE POSITION 255
AS
BEGIN
   POST_EVENT 'TABL$STR';
END
^
CREATE OR ALTER TRIGGER TRIG$STR_BIU_200 FOR TABL$STR
ACTIVE BEFORE INSERT OR UPDATE POSITION 200
AS
BEGIN
  IF(NEW.DATE_COMMIT IS NULL)THEN NEW.DATE_COMMIT = CURRENT_TIMESTAMP;
  IF(NEW.USER_ID     IS NULL)THEN
    BEGIN
    NEW.USER_ID = RDB$GET_CONTEXT('USER_SESSION', 'DATABASE_USER');
    END
  IF(NEW.USER_ID     IS NULL)THEN
    BEGIN
    NEW.USER_ID = CURRENT_USER;
    END
END
^
CREATE OR ALTER TRIGGER TRIG$STR_BI_000 FOR TABL$STR
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
  NEW.ID = GEN_ID(GENR$STR_ID, 1);
END
^
SET TERM ; ^
COMMIT;

/******************************************************************************/
/***                               Privileges                               ***/
/******************************************************************************/
GRANT UPDATE, REFERENCES ON TABL$STR TO TRIGGER TRIG$STR_ADIU_255;
GRANT UPDATE, REFERENCES ON TABL$STR TO TRIGGER TRIG$STR_BIU_200;
GRANT UPDATE, REFERENCES ON TABL$STR TO TRIGGER TRIG$STR_BI_000;
COMMIT;



Спасибо за материал. Структура уже есть, более простая.
...
Рейтинг: 0 / 0
13.01.2014, 13:44:22
    #38524283
Сисдба Мастеркеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как хранить длинные строки?
Кстати, однажды пришла в голову "гениальная" идея хранить строки неизвестной длины как-то так:

Код: sql
1.
2.
3.
4.
5.
create table sometab (
  id bigint not null,
  str_short varchar(1000),
  str_long blob sub_type text
);



Запись производить, в зависимости от длины записываемой строки, либо в str_short, либо в str_long.
Выборку типа так: coalesce(str_short, str_long)

Для выборки можно вьюху сделать.

Навскидку, вижу только неудобство с сортировкой. Но какой смысл сортировать строки неизвестной длины ? Вряд ли там будет храниться что-то сортируемое.

Из плюсов: не плодятся блобы в базе без необходимости. На сколько я понимаю, если в блобе null, то он не занимает места и не "тормозит" выборки.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
13.01.2014, 13:54:41
    #38524305
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как хранить длинные строки?
Сисдба МастеркеевичНа сколько я понимаю, если в блобе null, то он не занимает места и не "тормозит" выборки.
Даже если не нул, не тормозит выборку (на сколько я помню).
...
Рейтинг: 0 / 0
13.01.2014, 14:33:14
    #38524382
Ivan_Pisarevsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как хранить длинные строки?
Занудовв день добавляется примерно ок 20 записей.
Занудовпримерно ок. 1000 знаков.Это очень мало очень коротких строк. вот когда будет несколько десятков миллионов в день и длиной от 8000 символов тогда приходи, бум думать.

А пока варчар прямо по месту, без изысков.
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Как хранить длинные строки? / 20 сообщений из 20, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]