powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Наследование таблиц
18 сообщений из 18, страница 1 из 1
Наследование таблиц
    #34790148
кукуся
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день :)
Начинаю изучать наследование таблиц в Постгре - хотелось бы узнать возможно ли следующее:

Создаю таблицу
user_base c ключевым полем id
от нее наследую таблицу
user с ключевым полем id


Создаю таблицу
device_base
c ключевым полем id
и внешним ключем id_user
CONSTRAINT fk_id_user FOREIGN KEY (id_user)
REFERENCES user_base (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION

очень надеялась, что device_base будет воспринимать пользователей, как user_base, так и user
но :(
при создании записи в таблице device_base с id_user из user -- говорит о неправильном внешнем ключе....
постгре, конечно, прав, но как мне реализовать такую схему наследования?


PS: Мжет кто-нибудь порекомендует форумы по Постгре :)
чувствую зависла в теме
...
Рейтинг: 0 / 0
Наследование таблиц
    #34790805
Ми
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот ссылка по теме
http://www.postgresql.org/docs/current/static/ddl-inherit.html
5.8.1
Specifying that another table's column REFERENCES cities(name) would allow the other table to contain city names, but not capital names. There is no good workaround for this case.
Выходит, нельзя так сделать...:(
...
Рейтинг: 0 / 0
Наследование таблиц
    #34791224
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ми There is no good workaround for this case.решение - произвести таки доп таблицу (центровую таблицу звезды с полем id, на которую вторичными ссылаться как из user так и из user_base (к соотвествующим таблам написать триггера беворе инсерт(/апдейт)/дилет - на пополнение(/апдейт)/очищение этой центральной таблички (ктстати, если не проверять при инсерте наличия id, тот этот же механизм обеспечит отсутствие дублей id в разных таблах иерархии(того же можно добиться и иным триггером)). Далее вязаться device_base-ом на эту "центровую таблицу". (формально все ограничения целостности будут соблюдены).

Вообще говоря - видимо было бы чудно если бы центровая "таблица" была бы index-organized -"таблицей" (т.е. попросту - индексом). Но видимо тут у разработчиков проблемы с.
...
Рейтинг: 0 / 0
Наследование таблиц
    #34791293
Ми
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
решение - произвести таки доп таблицу
Можно так. Но при таком подходе наследование user от user_base и не требуется вовсе.
...
Рейтинг: 0 / 0
Наследование таблиц
    #34791359
кукуся
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ми решение - произвести таки доп таблицу
Можно так. Но при таком подходе наследование user от user_base и не требуется вовсе.

требуется - для выборок
...
Рейтинг: 0 / 0
Наследование таблиц
    #34791376
кукуся
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
может не заморачиваться с fk?
а реализовать проверку на триггерах? или check?


кстати с наследованием триггеров - в Postgre - беда-печаль?
...
Рейтинг: 0 / 0
Наследование таблиц
    #34791562
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ми не требуется вовсе.требуется и удобно - немног о разные понятия.
звзда известна и без наследования, но наследование поставляет некие (возможно - эфемерные) удобства. например выборка по условию из вью с UNION не обязательно задействует индексы (где-то тут было, кажется для 8.1.), а для выборки через предка - использует.
...
Рейтинг: 0 / 0
Наследование таблиц
    #34791574
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
assaвыборка по условию из вью с UNION не обязательно задействует индексы (где-то тут было, кажется для 8.1.)ЗЫ это конечно можно отнести на счет недоработок оптимизатора, ну, дык - инструмент таков, каков он есть, и, если уж выбран, приходится пользовать именно его особенности.
...
Рейтинг: 0 / 0
Наследование таблиц
    #34963456
bsdi4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Млин бред какой-то.... Че мозг новичку парить...
Легко, это наследование сделать можно, более подробно распиши организацию и структуру таблиц, в ответ получишь готовое решение...
...
Рейтинг: 0 / 0
Наследование таблиц
    #34963460
bsdi4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
кукусяочень надеялась, что device_base будет воспринимать пользователей, как user_base, так и user
но :(
при создании записи в таблице device_base с id_user из user -- говорит о неправильном внешнем ключе....
постгре, конечно, прав, но как мне реализовать такую схему наследования?
Как я понял из написанного вами, вытекают следующее варианты:

/* Если используем один обьедененный внешний ключ */

-- Таблица User

Drop Sequence If Exists "uid" Cascade;

Create Sequence "uid" Increment 1 Start 1;

Drop Table If Exists "User" Cascade;

Create Table "User" (
uid integer default nextval('"uid"') not null,
uname character varying(100) not null,
constraint "UserPK" primary key(uid),
constraint "UserU" unique(uname)
) without OIDS;

-- Таблица UserBase

Drop Sequence If Exists "ubid" Cascade;

Create Sequence "ubid" Increment 1 Start 1;

Drop Table If Exists "UserBase" Cascade;

Create Table "UserBase" (
uid integer not null,
ubid integer default nextval('"ubid"') not null,
ubname character varying(100) not null,
constraint "UserBaseFK" foreign key(uid) references "User" on delete cascade,
constraint "UserBasePK" primary key(uid,ubid),
constraint "UserBaseU" unique(ubname)
) without OIDS;

-- Таблица DeviceBase

Drop Sequence If Exists "did" Cascade;

Create Sequence "did" Increment 1 Start 1;

Drop Table If Exists "DeviceBase" Cascade;

-- Если наследуем таблицу User

Create Table "DeviceBase" (
uid integer not null,
did integer default nextval('"did"') not null,
dname character varying(100) not null,
constraint "DeviceBaseFK" foreign key(uid) references "User" on delete cascade,
constraint "DeviceBasePK" primary key(did,uid),
constraint "DeviceBaseU" unique(dname)
) without OIDS;

-- Если наследуем таблицу UserBase

Create Table "DeviceBase" (
uid integer not null,
ubid integer not null,
did integer default nextval('"did"') not null,
dname character varying(100) not null,
constraint "DeviceBaseFK" foreign key(uid,ubid) references "UserBase" on delete cascade,
constraint "DeviceBasePK" primary key(did,uid,ubid),
constraint "DeviceBaseU" unique(dname)
) without OIDS;


/* Если не используем обьедененный внешний ключ */

-- Таблица User

Drop Sequence If Exists "uid" Cascade;

Create Sequence "uid" Increment 1 Start 1;

Drop Table If Exists "User" Cascade;

Create Table "User" (
uid integer default nextval('"uid"') not null,
uname character varying(100) not null,
constraint "UserPK" primary key(uid),
constraint "UserU" unique(uname)
) without OIDS;

-- Таблица UserBase

Drop Sequence If Exists "ubid" Cascade;

Create Sequence "ubid" Increment 1 Start 1;

Drop Table If Exists "UserBase" Cascade;

Create Table "UserBase" (
uid integer not null,
ubid integer default nextval('"ubid"') not null,
ubname character varying(100) not null,
constraint "UserBaseFK" foreign key(uid) references "User" on delete cascade,
constraint "UserBasePK" primary key(uid),
constraint "UserBaseU" unique(ubname)
) without OIDS;


-- Таблица DeviceBase

Drop Sequence If Exists "did" Cascade;

Create Sequence "did" Increment 1 Start 1;

Drop Table If Exists "DeviceBase" Cascade;

-- Если наследуем таблицу User

Create Table "DeviceBase" (
uid integer not null,
did integer default nextval('"did"') not null,
dname character varying(100) not null,
constraint "DeviceBaseFK" foreign key(uid) references "User" on delete cascade,
constraint "DeviceBasePK" primary key(did),
constraint "DeviceBaseU" unique(dname)
) without OIDS;

-- Если наследуем таблицу UserBase

Create Table "DeviceBase" (
ubid integer not null,
did integer default nextval('"did"') not null,
dname character varying(100) not null,
constraint "DeviceBaseFK" foreign key(ubid) references "UserBase" on delete cascade,
constraint "DeviceBasePK" primary key(did),
constraint "DeviceBaseU" unique(dname)
) without OIDS;

-- Если наследуем обе таблицы

Create Table "DeviceBase" (
uid integer not null,
ubid integer not null,
did integer default nextval('"did"') not null,
dname character varying(100) not null,
constraint "DeviceBaseFK1" foreign key(uid) references "User" on delete cascade,
constraint "DeviceBaseFK2" foreign key(ubid) references "UserBase" on delete cascade,
constraint "DeviceBasePK" primary key(did),
constraint "DeviceBaseU" unique(dname)
) without OIDS;
...
Рейтинг: 0 / 0
Наследование таблиц
    #34963472
bsdi4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Только не понимаю зачем тут наследование когда ссылочная целостность вполне подойдет...
...
Рейтинг: 0 / 0
Наследование таблиц
    #34967055
ZemA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кстати насчет наследования. что-то тут не то с первичными ключами.
вот пример.
Код: 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.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
CREATE TABLE "наследование"
(
  "текст" text NOT NULL,
  "флаг" boolean NOT NULL,
  CONSTRAINT "наследование_pkey" PRIMARY KEY ("текст")
)
WITHOUT OIDS;

CREATE TABLE "наследование_1"
(
-- Inherited:   "текст" text NOT NULL,
-- Inherited:   "флаг" boolean NOT NULL DEFAULT true,
  CONSTRAINT "наследование_1_pkey" PRIMARY KEY ("текст"),
  CONSTRAINT "$1" CHECK ("флаг" = true)
)
INHERITS ("наследование")
WITHOUT OIDS;

CREATE TABLE "наследование_2"
(
-- Inherited:   "текст" text NOT NULL,
-- Inherited:   "флаг" boolean NOT NULL DEFAULT false,
  CONSTRAINT "наследование_2_pkey" PRIMARY KEY ("текст"),
  CONSTRAINT "$1" CHECK ("флаг" = false)
)
INHERITS ("наследование")
WITHOUT OIDS;

insert into "наследование_1" values ('раз', true);
insert into "наследование_2" values ('раз', false);
insert into "наследование" values ('раз', false);

select * from "наследование";
 текст | флаг
-------+------
 раз   | f
 раз   | t
 раз   | f
( 3  rows)
так и должно быть?
...
Рейтинг: 0 / 0
Наследование таблиц
    #34967106
Andrey Daeron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZemAкстати насчет наследования. что-то тут не то с первичными ключами.
вот пример.
Код: plaintext
skiped
так и должно быть?
Да. В PostgreSQL ключи являются атрибутом отношения, и на наследования им чихать и плевать. Межотношенейских (мультитабличных по сути) ключей в PostgreSQL нет. Есть всякие "левые" способы обхода этого явления, на форуме обсуждались.
...
Рейтинг: 0 / 0
Наследование таблиц
    #34967560
bsdi4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ребят мне может кто-нибудь обьяснить зачем в данном случае наследование, может я конечно чего-то не догоняю а?
Чем ссылки то не подойдут а?
И насколько понял покрутя PostgreSQL и почитая мануалы, c реализацтей наследований не совсем все гладко выходит,
есть подводные камни, так за чем, штаны через голову надевать?
И в дабавок советовать это новичку, чтоб он 20000 раз наткнулся на тебе же грабли, как и все в свое время?
Просто логики не вижу...
...
Рейтинг: 0 / 0
Наследование таблиц
    #34967570
bsdi4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сорри за офф топ!
...
Рейтинг: 0 / 0
Наследование таблиц
    #34968029
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bsdi4Ребят мне может кто-нибудь обьяснить зачем в данном случае наследование, может я конечно чего-то не догоняю а?
Чем ссылки то не подойдут а?
И насколько понял покрутя PostgreSQL и почитая мануалы, c реализацтей наследований не совсем все гладко выходит,
есть подводные камни, так за чем, штаны через голову надевать?
И в дабавок советовать это новичку, чтоб он 20000 раз наткнулся на тебе же грабли, как и все в свое время?
Просто логики не вижу...

там где наследование используется к месту - очень важаня фича, которой нет других больших серверах баз.
Я ствлю эксперименты с полнтектсовым поиском для большой базы. Так вот делил базу для быстрого добавления данных и ускорения поиска по совету коллег из форума используя наследование...
...
Рейтинг: 0 / 0
Наследование таблиц
    #34968685
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bsdi4 Winnipuh bsdi4Ребят мне может кто-нибудь обьяснить зачем в данном случае наследование, может я конечно чего-то не догоняю а?
Чем ссылки то не подойдут а?
И насколько понял покрутя PostgreSQL и почитая мануалы, c реализацтей наследований не совсем все гладко выходит,
есть подводные камни, так за чем, штаны через голову надевать?
И в дабавок советовать это новичку, чтоб он 20000 раз наткнулся на тебе же грабли, как и все в свое время?
Просто логики не вижу...

там где наследование используется к месту - очень важаня фича, которой нет других больших серверах баз.
Я ствлю эксперименты с полнтектсовым поиском для большой базы. Так вот делил базу для быстрого добавления данных и ускорения поиска по совету коллег из форума используя наследование...
Так вот уебок, прочитай первый пост и заткни хлебало!
а для тех кто в танке мы говорим имеено про него.
и не флуди, гандон.

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

и подпись у вас правильная, удачи вам в изучении!
...
Рейтинг: 0 / 0
Наследование таблиц
    #34968841
bsdi4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Winnipuh bsdi4 Winnipuh bsdi4Ребят мне может кто-нибудь обьяснить зачем в данном случае наследование, может я конечно чего-то не догоняю а?
Чем ссылки то не подойдут а?
И насколько понял покрутя PostgreSQL и почитая мануалы, c реализацтей наследований не совсем все гладко выходит,
есть подводные камни, так за чем, штаны через голову надевать?
И в дабавок советовать это новичку, чтоб он 20000 раз наткнулся на тебе же грабли, как и все в свое время?
Просто логики не вижу...

там где наследование используется к месту - очень важаня фича, которой нет других больших серверах баз.
Я ствлю эксперименты с полнтектсовым поиском для большой базы. Так вот делил базу для быстрого добавления данных и ускорения поиска по совету коллег из форума используя наследование...
Так вот уебок, прочитай первый пост и заткни хлебало!
а для тех кто в танке мы говорим имеено про него.
и не флуди, гандон.

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


Ой епт... японский гвоздь !!!!
это не тебе! Прости пожалуйста!
Я тут перепутал нафиг Copy Paste,
меня тут один мурло просто задалбал!
Ради бога прости!!!!
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Наследование таблиц
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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