powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / 1 поле в таблице??? допустимо?
22 сообщений из 22, страница 1 из 1
1 поле в таблице??? допустимо?
    #35815394
anydasa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет!

Для реализации языковой версионности, создал 2 таблицы:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
CREATE TABLE "public"."rubrics" (
  "id" SERIAL, 
  CONSTRAINT "rubrics_pk" PRIMARY KEY("id")
) WITHOUT OIDS;

CREATE TABLE "public"."rubrics_txt" (
  "id_rubrics" INTEGER NOT NULL, 
  "s_lang" CHAR( 2 ) NOT NULL, 
  "title" VARCHAR( 100 ) NOT NULL, 
  CONSTRAINT "rubrics_txt_pk" PRIMARY KEY("id_rubrics", "s_lang"), 
  CONSTRAINT "rubrics_txt_fk" FOREIGN KEY ("id_rubrics")
    REFERENCES "public"."rubrics"("id")
    ON DELETE CASCADE
    ON UPDATE CASCADE
    NOT DEFERRABLE, 
  CONSTRAINT "rubrics_txt_lang" FOREIGN KEY ("s_lang")
    REFERENCES "public"."site_langs"("lang")
    ON DELETE NO ACTION
    ON UPDATE NO ACTION
    NOT DEFERRABLE
) WITHOUT OIDS;

Допустимо ли что в таблице rubrics присутствует одно поле???
Если нет, то как сделать правильно, с учётом того что ID будет использоваться в других таблицаx (PK).
Если допустимо, тогда дополнительный вопрос: Как можно "вставить" в эту таблицу пустые данные, чтобы использовалась секвенция для поля ID.

Спасибо!
...
Рейтинг: 0 / 0
1 поле в таблице??? допустимо?
    #35815445
Senya_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
anydasa,

Возможность вставки в такую таблицу звисит от СУБД. По ДДЛ Вашу СУБД я определить не могу (Оракл?), но в МССКЛ, например, можно. В любом случае никто не мешает добавить в "public.rubrics" еще одно поле без особой смысловой нагрузки.

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

Вот очем стОит поговорить: Какая-то странная у Вас реализация "языковой версионности". Для чего это?
...
Рейтинг: 0 / 0
1 поле в таблице??? допустимо?
    #35815479
anydasa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Senya_Lanydasa,

Возможность вставки в такую таблицу звисит от СУБД. По ДДЛ Вашу СУБД я определить не могу (Оракл?), но в МССКЛ, например, можно.

PostgreSQL

Senya_L
Вот очем стОит поговорить: Какая-то странная у Вас реализация "языковой версионности". Для чего это?

Собственно поэтому и спрашиваю.
Раньше как то не задумывался, да и потом, я не единственный кто так делает, причём далеко.

База для сайта. Сайт мультиязычный.

Это не единственный случай в базе, таких пар около десяти.
...
Рейтинг: 0 / 0
1 поле в таблице??? допустимо?
    #35815548
Senya_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
anydasaРаньше как то не задумывался, да и потом, я не единственный кто так делает, причём далеко.Если "все" так делают, то это не повод поступать также. :)

Да еще пары таких табличек создавать. Такое проделывают обычно когда требуется идентификатор уникальный в пределах нескольких таблиц, а СУБД не поддерживает секуинсы. Из Ваших пояснений, а точнее их отсутствия :), непонятно - зачем? Кстати, Постгрес поддерживает CREATE SEQUENCE?
...
Рейтинг: 0 / 0
1 поле в таблице??? допустимо?
    #35815581
Bely
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Senya_LДа еще пары таких табличек создавать. Такое проделывают обычно когда требуется идентификатор уникальный в пределах нескольких таблиц, а СУБД не поддерживает секуинсы. Из Ваших пояснений, а точнее их отсутствия :), непонятно - зачем? Кстати, Постгрес поддерживает CREATE SEQUENCE?Если избавиться от таблицы "Рубрики", то как потом из других таблиц ссылаться на рубрику, без учета языка? FK на таблицу "rubrics_txt" только по "id_rubrics" создать не удасться. Либо придется обходиться без FK и вручную контролировать целостность, либо создавать такую таблицу.
...
Рейтинг: 0 / 0
1 поле в таблице??? допустимо?
    #35815640
anydasa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Senya_L
Да еще пары таких табличек создавать. Такое проделывают обычно когда требуется идентификатор уникальный в пределах нескольких таблиц, а СУБД не поддерживает секуинсы.

НЕ понял!

Senya_Lнепонятно - зачем?

Если рубрики делать одной таблицей, то как мне сделать уникальный идентификатор, если уникальность задаётся на два поля, id_rubrics, s_lang.
Ведь, рубрика, независимо от версии языка, остаётся та же.

Senya_LКстати, Постгрес поддерживает CREATE SEQUENCE?

Поддерживает, был вопрос как мне им воспользоваться. Уже решил:
Код: plaintext
insert into rubrics (id) values(nextval(('public.rubrics_id_seq'::text)::regclass))
Была еще идея вообще отказатся от SEQUENCE, и делать так, только тут нужен ещё кейс, на случай если втавляемая строка будет первая.
Код: plaintext
insert into rubrics (id) values((SELECT id FROM rubrics ORDER BY id DESC LIMIT  1 ) +  1 )

Вобщем, вопрос КАК , уже решён.

Осталось услышать мнения о самом подходе реализации версионности.

Была ещё мысль делать через общий словарик, где будут храниться все переводы всех таблиц. А у родителей создавать кода (Россия = russia ; IT,программисты - it_programm ; и тп.)
...
Рейтинг: 0 / 0
1 поле в таблице??? допустимо?
    #35815826
Senya_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
anydasaSenya_L
Да еще пары таких табличек создавать. Такое проделывают обычно когда требуется идентификатор уникальный в пределах нескольких таблиц, а СУБД не поддерживает секуинсы.

НЕ понял! Тынц
anydasaЕсли рубрики делать одной таблицей, то как мне сделать уникальный идентификатор, если уникальность задаётся на два поля, id_rubrics, s_lang.
Ведь, рубрика, независимо от версии языка, остаётся та же.Или я не понимаю, или Вы мудрите. Есть же PK
Код: plaintext
CONSTRAINT "rubrics_txt_pk" PRIMARY KEY("id_rubrics", "s_lang"), 
который гарантирует неповторяемость s_lang в пределах id_rubrics? Версии говорите... Ну так можно же создать столбец, назовем его prev_version_id которое FK, ссылающееся на предыдущую версию рубрики.
...
Рейтинг: 0 / 0
1 поле в таблице??? допустимо?
    #35815878
anydasa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Senya_LНу так можно же создать столбец, назовем его prev_version_id которое FK, ссылающееся на предыдущую версию рубрики.

Этого не требуется.

FK можно создать только на уникальный ключ, а уникальность у нас это id_rubrics,s_lang, следовательно FK на id_rubrics нельзя, так как он не единственный участник в PK т.е. не уникальный.
...
Рейтинг: 0 / 0
1 поле в таблице??? допустимо?
    #35815885
Senya_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
anydasaSenya_LНу так можно же создать столбец, назовем его prev_version_id которое FK, ссылающееся на предыдущую версию рубрики.

Этого не требуется.

FK можно создать только на уникальный ключ, а уникальность у нас это id_rubrics,s_lang, следовательно FK на id_rubrics нельзя, так как он не единственный участник в PK т.е. не уникальный.И что из этого? Используйте суррогатный первичный ключ.
...
Рейтинг: 0 / 0
1 поле в таблице??? допустимо?
    #35815893
anydasa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Senya_LИ что из этого? Используйте суррогатный первичный ключ.

Как сказал Bely , - "Если избавиться от таблицы "Рубрики", то как потом из других таблиц ссылаться на рубрику, без учета языка?"

Задача сослаться на рубрику, а не на языковую версию рубрики
...
Рейтинг: 0 / 0
1 поле в таблице??? допустимо?
    #35815918
Senya_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
anydasaSenya_LИ что из этого? Используйте суррогатный первичный ключ.

Как сказал Bely , - "Если избавиться от таблицы "Рубрики", то как потом из других таблиц ссылаться на рубрику, без учета языка?"

Задача сослаться на рубрику, а не на языковую версию рубрикиПоймите, мой хрустальный шар замутнен пятничными флюидами. Я не могу догадаться про постановку задачи. Я Вам предлагаю добавить столбец, обычный последовательно нумеруемый айдишник. Версии образуют цепочку (кстати, на поле prev_version_id должен быть наложен уникальный констрейнт, чтобы получилась именно цепочка). Последняя запись в этой цепочке - текущая актуальная версия рубрики с определенным языком. Т.е. чтобы сослаться на рубрику выбираете пару значений id_rubrics,s_lang и ищете последнюю в последовательности версий запись. Кстати, для экономичности можно версионность вести не через prev_version_id, а через next_version_id. У последней версии это поле будет НУЛЛ. Улавливаете?
...
Рейтинг: 0 / 0
1 поле в таблице??? допустимо?
    #35815984
anydasa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Senya_L
Поймите, мой хрустальный шар замутнен пятничными флюидами. Я не могу догадаться про постановку задачи. Я Вам предлагаю добавить столбец, обычный последовательно нумеруемый айдишник. Версии образуют цепочку (кстати, на поле prev_version_id должен быть наложен уникальный констрейнт, чтобы получилась именно цепочка). Последняя запись в этой цепочке - текущая актуальная версия рубрики с определенным языком. Т.е. чтобы сослаться на рубрику выбираете пару значений id_rubrics,s_lang и ищете последнюю в последовательности версий запись. Кстати, для экономичности можно версионность вести не через prev_version_id, а через next_version_id. У последней версии это поле будет НУЛЛ. Улавливаете?

Честно говоря не понял ничего. Но смыл то в чём, что у версии будет уник номер.

У нас есть другие таблицы, которые хотят сослаться на рубрики, и как это сделать с вашем вариантом? Т.е. это конечно можно, но как потом работать? Впринципе и это можно, но не кажется ли Вам, что гараздо легче использовать схему двух таблиц???
...
Рейтинг: 0 / 0
1 поле в таблице??? допустимо?
    #35816032
Senya_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
anydasaВпринципе и это можно, но не кажется ли Вам, что гараздо легче использовать схему двух таблиц???Не кажется. Толку от нее никакого.
Вот пример (ДДЛ для Файерберда)
Код: plaintext
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.
CREATE TABLE RUBRICS_TXT (
    ID               INTEGER NOT NULL,
    NEXT_VERSION_ID  INTEGER,
    LANG             CHAR( 2 ) NOT NULL,
    TITLE            VARCHAR( 100 ) NOT NULL
);

ALTER TABLE RUBRICS_TXT ADD CONSTRAINT PK_RUBRICS_TXT PRIMARY KEY (ID);

ALTER TABLE RUBRICS_TXT ADD CONSTRAINT FK_RUBRICS_TXT_1 FOREIGN KEY (NEXT_VERSION_ID) REFERENCES RUBRICS_TXT (ID);

-- автоинкремент
CREATE GENERATOR GEN_RUBRICS_TXT_ID;

SET TERM ^ ;

/* Trigger: RUBRICS_TXT_BI */
CREATE OR ALTER TRIGGER RUBRICS_TXT_BI FOR RUBRICS_TXT
ACTIVE BEFORE INSERT POSITION  0 
AS
BEGIN
  IF (NEW.ID IS NULL) THEN
    NEW.ID = GEN_ID(GEN_RUBRICS_TXT_ID, 1 );
END
^

SET TERM ; ^
...
Рейтинг: 0 / 0
1 поле в таблице??? допустимо?
    #35816150
anydasa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Senya_L,

Допустим.
А теперь представим что у нас есть таблизца "Объявы" которая связана через "Объява_ref_Рубрика".
ОТ "Объява" ID и от "Рубрика" оба в PK, короче много ко многим. У нас может быть объява лежать с разными номерами ID RUBRICS, т.к. сущности разные, но рубрика будет одна. И это плохо ИМХО.
...
Рейтинг: 0 / 0
1 поле в таблице??? допустимо?
    #35816221
Senya_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
anydasaSenya_L,

Допустим.
А теперь представим что у нас есть таблизца "Объявы" которая связана через "Объява_ref_Рубрика".
ОТ "Объява" ID и от "Рубрика" оба в PK, короче много ко многим. У нас может быть объява лежать с разными номерами ID RUBRICS, т.к. сущности разные, но рубрика будет одна. И это плохо ИМХО.Не нравится, что одну и ту же "Объява" можно связать с несколькими "Рубрика", которые всего лишь являются разными версиями? Это действительно нехорошо, согласен.

Но декларативными ограничениями не ограничиваются способы поддержания целостности данных. ;) Есть триггеры, есть ХП.

ЗЫ. Кстати, я вот понимаю, а что в Вашей "парно-табличной" схеме помешает сделать то же самое?
...
Рейтинг: 0 / 0
1 поле в таблице??? допустимо?
    #35816287
guest_20040621
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> Допустимо ли что в таблице rubrics присутствует одно поле???

Допустимо. Но не рационально. В базе данных есть смысл поддерживать глобальные управляющие идентификаторы для более сложных задач (например, история изменений). Локализацию проще реализовать, перенеся соответствующий идентификатор в таблицу rubrics_txt. Получится иерархия, с которой будет удобно работать.
...
Рейтинг: 0 / 0
1 поле в таблице??? допустимо?
    #35816573
Senya_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
guest_20040621> Допустимо ли что в таблице rubrics присутствует одно поле???

Допустимо. Но не рационально. В базе данных есть смысл поддерживать глобальные управляющие идентификаторы для более сложных задач (например, история изменений). Локализацию проще реализовать, перенеся соответствующий идентификатор в таблицу rubrics_txt. Получится иерархия, с которой будет удобно работать.У автора не иерархия, у него версионность рубрикатора.
...
Рейтинг: 0 / 0
1 поле в таблице??? допустимо?
    #35816577
anydasa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Senya_L
ЗЫ. Кстати, я вот понимаю, а что в Вашей "парно-табличной" схеме помешает сделать то же самое?

Не уверен что понял Ваш вопрос правильно. Сделать что, привязки? Так я связывать буду с rubrics.id тут он уникален.
...
Рейтинг: 0 / 0
1 поле в таблице??? допустимо?
    #35816606
Senya_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
anydasaSenya_L
ЗЫ. Кстати, я вот понимаю, а что в Вашей "парно-табличной" схеме помешает сделать то же самое?

Не уверен что понял Ваш вопрос правильно. Сделать что, привязки? Так я связывать буду с rubrics.id тут он уникален.Вроде понятно выражаюсь. Пятница, видимо сказывается. :)

Что мне помешает создать связи для одной и той же Объявы к разным версиям одной и той же Рубрики?
...
Рейтинг: 0 / 0
1 поле в таблице??? допустимо?
    #35816630
anydasa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Senya_LВроде понятно выражаюсь. Пятница, видимо сказывается. :)

:) Видимо

Senya_LЧто мне помешает создать связи для одной и той же Объявы к разным версиям одной и той же Рубрики?

Как, если языки описываются в таблице rubrics_txt, а связываем мы с rubrics?
...
Рейтинг: 0 / 0
1 поле в таблице??? допустимо?
    #35816706
Senya_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я Вас неправильно понял. Мы про разные версии говорим.
Разбейте таблицу Рубрик-ткст на две или сделайте иерархический справочник. Иначе с 3НФ у Вас будут нелады.
...
Рейтинг: 0 / 0
1 поле в таблице??? допустимо?
    #35817694
guest_20040621
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> У автора не иерархия, у него версионность рубрикатора.

Дружище, приведенное решение - исчерпывающе пОлно для сформулированной задачи. Просто читайте и запоминайте.

У автора проблемы с терминологией. Никакой "языковой версионности" не существует. В этом контексте есть две независимые задачи - мультиязычность (эту задачу решает автор вопроса) и версионность. Они никак друг с другом не связаны.
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / 1 поле в таблице??? допустимо?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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