Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Наследование в базе данных / 24 сообщений из 24, страница 1 из 1
04.01.2004, 18:21
    #32368121
KhasDenis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование в базе данных
В системе имеем следующие сущности manager, realtor, seller и buyer. Все они являются пользователями моей системы, т.е. все они user'ы. При регистрации каждый из них указывает ,помимо общей для каждого пользователя информации, специфическую для каждой роли. Как правильней спроектировать бд? Есть вариант просто четыре таблицы manager, realtor, seller и buyer. Но в этом случае при "определении/подсчете" какой нибудь общей статистики по пользователям придется по всем таблицам бродить.
Еще вариант создаем таблицы manager, realtor, seller ,buyer и user. Таблица realtor(seller, buyer) имеет внешний ключ на user. Но здесь insert какой то некрасивый получается, нужно вставить половину введеной пользователем информации в одну таблицу, а половину в другую, причем в realtor.user_id надо вставить user.id, который автоинкремент.
помогите торможу ...
...
Рейтинг: 0 / 0
04.01.2004, 20:14
    #32368150
Роман Дынник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование в базе данных
Наследование реализуется в виде связи 1-к-1 между 2-мя таблицами

Еще вариант создаем таблицы manager, realtor, seller ,buyer и user. Таблица realtor(seller, buyer) имеет внешний ключ на user. Но здесь insert какой то некрасивый получается,
нужно вставить половину введеной пользователем информации в одну таблицу, а половину в другую

Все правильно.
Удобнее всего создать слой хранимых процедур для операций с данными.
Для каждой таблицы нужно определить соответствующие хп (sp_Insxxx,sp_Updxxx ,sp_delxxx) в них производить и вызывать insert и если нужно(при наследовании) вызов хп базового класса:
exec sp_InsUser @id out,@p2, @p3
insert into realtor values(@id,@p4,@p5)

причем в realtor.user_id надо вставить user.id, который автоинкремент.
Автоинкрементным поле сделать только в базовом классе(таблице).
При insert-е его можно возвратить через @@identity:
SET @id=@@identity, где @id- выходной параметр хп
...
Рейтинг: 0 / 0
05.01.2004, 07:52
    #32368230
StarWind
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование в базе данных
Роман Дынник
и где ты увидел что у человека MS SQL? В других СУБД твой синтаксис уже не пройдет. А вообще твоя мысль дельная. Можно пойти еще далее и посмотреть, может стоит объеденить таблицы manager, realtor, seller, buyer? но тут надо уже смотреть что в них и какую информацию они несут...
...
Рейтинг: 0 / 0
05.01.2004, 10:18
    #32368312
gardenman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование в базе данных
Интересно, а продавец не может быть одновременно и покупателем?
...эт так между прочим...
вообще должны быть две ключевых таблицы юзеров и сделок. и нефиг чушь пороть.
...
Рейтинг: 0 / 0
05.01.2004, 10:31
    #32368329
StarWind
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование в базе данных
в таблице user помимо всего прочего можно держать информацию о пользователях системы... А посему резонно вынести людей (всех) в отдельную таблицу. Там будет самый обычный набор атрибутов, типа ФИО и тому подобной лабуды. (Аккаунт в проге, либо, по необходимости в этом поле можно поместить что это не пользователь системы)
...
Рейтинг: 0 / 0
05.01.2004, 16:18
    #32368717
KhasDenis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование в базе данных
2 Роман Дынник
У меня всего лишь mysql, но в твоем посте много интересного нашел. спасибо.

2 gardenman

> Интересно, а продавец не может быть одновременно и покупателем?
может, но это неважно. продавец как бы пользователь более высокого уровня, он может все что может покупатель и еще кое что. Так что система его все равно распознает как продавца, но разрешит ему "купить" что ему нужно.

> вообще должны быть две ключевых таблицы юзеров и сделок. и нефиг чушь > пороть.
сделок нет, извини.

2 StarWind
> в таблице user помимо всего прочего можно держать информацию о >пользователях системы... А посему резонно вынести людей (всех) в >отдельную таблицу.

Да, резонно. Там логины - пароли будут.
Я связываю таблицы так: realtor.user_id = user.id. Таблица user ничего незнает о таблице realtor, таблица realtor имеет внешний ключ на таблицу user.
При регистрации я заношу данные в таблицу user, id -автоинкремент, теперь надо занести данные еще и в realtor. Что указать в поле realtor.user_id ???
Как узнать значение user.id для только что добавленной записи.
Оставить поле user.id без автоинкремента и самому за уникальностью следить?
...
Рейтинг: 0 / 0
06.01.2004, 03:26
    #32369023
StarWind
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование в базе данных
так это же самая простая проблема из всех которые возникнут )
ты главное назови СУБД какая
для MS SQL тебе сказали как... есть методы для Oracle, Interbase, других баз.
Я думаю класическим примером будет следующее

1) Зовем следующее значение генератора (сиквенса или чего-то аналогичного)
2) Вставляем запись в главную таблицу, используя значение из п.1
3) Вставляем запись в подчиненную таблицу, используя значение из п.1

"И будет все хорошо, как у меня" (с)
...
Рейтинг: 0 / 0
06.01.2004, 10:47
    #32369139
KhasDenis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование в базе данных
Базу я назвал - mysql ...
create table user (id int(4) PRIMARY KEY AUTO_INCREMENT ... )
sequence я не создаю напрямую, как осуществить твой пункт 1 ?
или создать этот самый sequence ?

>так это же самая простая проблема из всех которые возникнут )
например ...
...
Рейтинг: 0 / 0
06.01.2004, 11:43
    #32369245
Роман Дынник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование в базе данных
Для MySQL:

select LAST_INSERT_ID();
или
API-функция mysql_insert_id() , например для вызова из PHP.

(это способы получить последний id после insert-а)

Для организации своих последовательностей понадобится таблица
типа:
[идентификатор последовательности]
[наименование последовательности]
[текущее значение] (int/varchar... по вкусу)

С ней и работать, обновляя текущее значение.
Получаем новое значение последовательности
//обновляем текущее значение
update t set [текущее значение]=[текущее значение]+1 where [идентификатор последовательности]=?
//получить обновленное значение:
select [текущее значение] from t where [идентификатор последовательности]=?

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

P.S.
Лучше обратить внимание на GUID для первичного ключа
...
Рейтинг: 0 / 0
06.01.2004, 11:53
    #32369253
Роман Дынник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование в базе данных
в догонку:
У меня всего лишь mysql
ничего страшного :), так называемый слой хп реализуй в виде методов PHP/Java/C#... классов.
Надо отразить таблицы БД на классы с методами. Наследование классов должно соответствовать "наследованию" таблиц.
...
Рейтинг: 0 / 0
06.01.2004, 12:43
    #32369323
KhasDenis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование в базе данных
авторесли вы установили MySQL без поддержки транзакций, в этом случае возможны "казусы"
Сейчас как раз пытаюсь это выяснить. У меня mysql 3.23.49, я его не собирал -он из дистрибутива. Таблицу InnoDB создал вроде.
...
Рейтинг: 0 / 0
08.01.2004, 03:27
    #32370104
StarWind
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование в базе данных
Роман Дынник
так и поддержка транзакций не поможет...
считываем данные из таблицы например получаем 5
причем считываем в двух транзакциях сразу
обе транзакции инкрементируют это число и обе пытаются вставить 6, а это не правильно!
подчеркну еще раз, нужна генерация уникальных значений на уровне СУБД.

KhasDenis
Сорри зе заметил про СУБД... насколько я знаю там нет хранимых процедур... а это плохо... А проблемы, у каждого свои, но они тем не менее всегда возникают :))
...
Рейтинг: 0 / 0
08.01.2004, 09:39
    #32370175
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование в базе данных
2StarWind

Поддержка транзакций поможет - если Transaction Isolation Level >= Repeatable Read - другой вопрос - какой ценой :)
...
Рейтинг: 0 / 0
09.01.2004, 10:16
    #32371191
AAron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование в базе данных
а клиента к базе данных на чем пишите? В принципе можно создать что-то типа критической секции (как в многопоточном приложении) и разрулить так.
...
Рейтинг: 0 / 0
09.01.2004, 10:28
    #32371205
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование в базе данных
2AAron

Да бросьте, я бы лучше посмотрел в сторону GUID или своих ключей создаваемых например по времени или еще какие-нибудь алгоритмы
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
28.10.2010, 20:12
    #36926592
SORMB4
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование в базе данных
Здравствуйте, уважаемые любители БД!
Хотелось бы поднять тему, т.к. столкнулся с аналогичной проблемой.
Есть каталог инструментов и каталог удобрений, всё это вещи. у каждой вещи есть общие параметры. У инструментов + свои, у удобрений + свои. Есть люди. Каждый человек может иметь несколько вещей различного типа. Например, 3 лопаты, 5 удобрений "майский жук" и 2 грабли.
Каталогов ограниченное количество.
По общим характеристикам есть много запросов, например стоимость всех вещей пользователя.

Вопрос: как реализовать в mysql? (имхо субд тут не оч большое значение играет, пусть это будет мускл)
На мой взгляд, это наследование.
Во втором посте предлагается решение такое:
создаем 2 таблицы: пользователь-удобрение, пользователь-инструмент и таблицу вещь. в эти две таблицы опускаем первичные ключи из вещи. Т.е. при добавлении вещи, добавляется в 2 таблицы: 1 -в вещь, 2 - в юзер-инструмент или в юзер-удобрение, по типу вещи. Получаем связи юзер-что-то И вещь 1 к 1, что плохо и дублирование инфы по владельцам вещи в ВЕЩИ и в юзер-что-то.

Как это правильно организовать для моей задачи?
Буду ОЧЕНЬ благодарен!!!
...
Рейтинг: 0 / 0
28.10.2010, 20:34
    #36926623
SORMB4
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование в базе данных
SORMB4,
мда..... почитал что на форуме это очень много расписано, но верного решения пока нет... да и решения, как выясняется, нужно делать под прямую конкретику... Все таки если кто-то предложит вариант решения моей проблемы с аргументированием подхода, скажу большое спасибо!
...
Рейтинг: 0 / 0
29.10.2010, 10:52
    #36927239
Naf
Naf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование в базе данных
можно еще так:
Код: 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 BASETABLE 
(
UID, --суррогатный первичный ключ
--общие поля
TYPE --мнемонический ключ, определяющий тип записи (какая дочерняя таблица)
);

CREATE TABLE CHILDTABLE
(
UID, --первичный ключ, он же внешний к базовой записи
--дочерние поля
);

CREATE VIEW CHILDVIEW (UID,...общие и дочерние поля) --обертка с которой и работаем
AS
SELECT UID, --+общие и дочерние поля
FROM CHILDTABLE
INNER JOIN BASETABLE ON (CHILDTABLE.UID=BASETABLE.UID)

CREATE TRIGGER CHILDVIEW_INSERT FOR CHILDVIEW --триггер обертки
AFTER INSERT AS
BEGIN
  INSERT INTO BASETABLE(...) VALUES (...);
  INSERT INTO CHILDTABLE(...) VALUES (...);
END

 /* +остальные триггеры UPDATE, DELETE*/
...
Рейтинг: 0 / 0
29.10.2010, 16:36
    #36928271
SORMB4
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование в базе данных
Да, на связи 1к1 и остановился я. Спасибо за подтверждение моей мысли, ибо по-другому тут без мега наворотов никак.
...
Рейтинг: 0 / 0
03.11.2010, 20:26
    #36937182
simply_sash
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование в базе данных
Роман Дынникничего страшного :), так называемый слой хп реализуй в виде методов PHP/Java/C#... классов.
StarWindнасколько я знаю там нет хранимых процедур... а это плохо...
В MySQL есть хранимые процедуры http://dev.mysql.com/tech-resources/articles/mysql-storedproc.html
...
Рейтинг: 0 / 0
04.11.2010, 18:41
    #36938364
Cat2
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование в базе данных
simply_sash
В MySQL есть хранимые процедуры http://dev.mysql.com/tech-resources/articles/mysql-storedproc.html

авторРоман Дынник
Member

Откуда: москва
Сообщений: 2887 в догонку:
У меня всего лишь mysql
ничего страшного :), так называемый слой хп реализуй в виде методов PHP/Java/C#... классов.
Надо отразить таблицы БД на классы с методами. Наследование классов должно соответствовать "наследованию" таблиц.
6 янв 04, 11:53
...
Рейтинг: 0 / 0
05.11.2010, 20:37
    #36939629
simply_sash
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование в базе данных
Cat2,

На дату внимания не обратил ;) Тогда так: В MySQL уже есть хранимые процедуры
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
08.09.2014, 20:27
    #38741079
specialist_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование в базе данных
KhasDenis,

Если кому интересно, тоже столкнулся с такой проблемой (база на MS SQL Server). Похоже, что наиболее распространенный метод: TPT (Table per Type Inheritance), это когдаделается базовая таблица с общими полями, а на каждый тип потомка - делается отдельная таблица.
http://www.sqlteam.com/article/implementing-table-inheritance-in-sql-server
все материалы (на английском) собрал в статье
http://dev-doc.blogspot.com/2014/09/ms-sql-server-emtity-framework-ef.html
...
Рейтинг: 0 / 0
08.09.2014, 23:19
    #38741153
Роман Дынник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование в базе данных
specialist_,

Все эти паттерны (не только TPT) были очень давно описаны Фаулером, задолго до того как появились на указанных ресурсах.
Поэтому, лучше будет обратиться к первоисточнику:
Single Table Inheritance (278) , Class Table Inheritance (285) , Concrete Table Inheritance (293)
http://martinfowler.com/eaaCatalog/index.html


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


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