Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Наследование таблиц / 18 сообщений из 18, страница 1 из 1
11.09.2007, 10:13
    #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
11.09.2007, 12:27
    #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
11.09.2007, 14:04
    #34791224
assa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование таблиц
Ми There is no good workaround for this case.решение - произвести таки доп таблицу (центровую таблицу звезды с полем id, на которую вторичными ссылаться как из user так и из user_base (к соотвествующим таблам написать триггера беворе инсерт(/апдейт)/дилет - на пополнение(/апдейт)/очищение этой центральной таблички (ктстати, если не проверять при инсерте наличия id, тот этот же механизм обеспечит отсутствие дублей id в разных таблах иерархии(того же можно добиться и иным триггером)). Далее вязаться device_base-ом на эту "центровую таблицу". (формально все ограничения целостности будут соблюдены).

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

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


кстати с наследованием триггеров - в Postgre - беда-печаль?
...
Рейтинг: 0 / 0
11.09.2007, 15:18
    #34791562
assa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование таблиц
Ми не требуется вовсе.требуется и удобно - немног о разные понятия.
звзда известна и без наследования, но наследование поставляет некие (возможно - эфемерные) удобства. например выборка по условию из вью с UNION не обязательно задействует индексы (где-то тут было, кажется для 8.1.), а для выборки через предка - использует.
...
Рейтинг: 0 / 0
11.09.2007, 15:21
    #34791574
assa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование таблиц
assaвыборка по условию из вью с UNION не обязательно задействует индексы (где-то тут было, кажется для 8.1.)ЗЫ это конечно можно отнести на счет недоработок оптимизатора, ну, дык - инструмент таков, каков он есть, и, если уж выбран, приходится пользовать именно его особенности.
...
Рейтинг: 0 / 0
25.11.2007, 07:41
    #34963456
bsdi4
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование таблиц
Млин бред какой-то.... Че мозг новичку парить...
Легко, это наследование сделать можно, более подробно распиши организацию и структуру таблиц, в ответ получишь готовое решение...
...
Рейтинг: 0 / 0
25.11.2007, 08:44
    #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
25.11.2007, 09:48
    #34963472
bsdi4
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование таблиц
Только не понимаю зачем тут наследование когда ссылочная целостность вполне подойдет...
...
Рейтинг: 0 / 0
27.11.2007, 09:18
    #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
27.11.2007, 09:41
    #34967106
Andrey Daeron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование таблиц
ZemAкстати насчет наследования. что-то тут не то с первичными ключами.
вот пример.
Код: plaintext
skiped
так и должно быть?
Да. В PostgreSQL ключи являются атрибутом отношения, и на наследования им чихать и плевать. Межотношенейских (мультитабличных по сути) ключей в PostgreSQL нет. Есть всякие "левые" способы обхода этого явления, на форуме обсуждались.
...
Рейтинг: 0 / 0
27.11.2007, 11:52
    #34967560
bsdi4
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование таблиц
Ребят мне может кто-нибудь обьяснить зачем в данном случае наследование, может я конечно чего-то не догоняю а?
Чем ссылки то не подойдут а?
И насколько понял покрутя PostgreSQL и почитая мануалы, c реализацтей наследований не совсем все гладко выходит,
есть подводные камни, так за чем, штаны через голову надевать?
И в дабавок советовать это новичку, чтоб он 20000 раз наткнулся на тебе же грабли, как и все в свое время?
Просто логики не вижу...
...
Рейтинг: 0 / 0
27.11.2007, 11:54
    #34967570
bsdi4
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование таблиц
Сорри за офф топ!
...
Рейтинг: 0 / 0
27.11.2007, 13:24
    #34968029
Winnipuh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование таблиц
bsdi4Ребят мне может кто-нибудь обьяснить зачем в данном случае наследование, может я конечно чего-то не догоняю а?
Чем ссылки то не подойдут а?
И насколько понял покрутя PostgreSQL и почитая мануалы, c реализацтей наследований не совсем все гладко выходит,
есть подводные камни, так за чем, штаны через голову надевать?
И в дабавок советовать это новичку, чтоб он 20000 раз наткнулся на тебе же грабли, как и все в свое время?
Просто логики не вижу...

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

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

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

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

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

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


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


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