powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Наследование в базе данных
24 сообщений из 24, страница 1 из 1
Наследование в базе данных
    #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
Наследование в базе данных
    #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
Наследование в базе данных
    #32368230
StarWind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Роман Дынник
и где ты увидел что у человека MS SQL? В других СУБД твой синтаксис уже не пройдет. А вообще твоя мысль дельная. Можно пойти еще далее и посмотреть, может стоит объеденить таблицы manager, realtor, seller, buyer? но тут надо уже смотреть что в них и какую информацию они несут...
...
Рейтинг: 0 / 0
Наследование в базе данных
    #32368312
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интересно, а продавец не может быть одновременно и покупателем?
...эт так между прочим...
вообще должны быть две ключевых таблицы юзеров и сделок. и нефиг чушь пороть.
...
Рейтинг: 0 / 0
Наследование в базе данных
    #32368329
StarWind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в таблице user помимо всего прочего можно держать информацию о пользователях системы... А посему резонно вынести людей (всех) в отдельную таблицу. Там будет самый обычный набор атрибутов, типа ФИО и тому подобной лабуды. (Аккаунт в проге, либо, по необходимости в этом поле можно поместить что это не пользователь системы)
...
Рейтинг: 0 / 0
Наследование в базе данных
    #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
Наследование в базе данных
    #32369023
StarWind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так это же самая простая проблема из всех которые возникнут )
ты главное назови СУБД какая
для MS SQL тебе сказали как... есть методы для Oracle, Interbase, других баз.
Я думаю класическим примером будет следующее

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

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

>так это же самая простая проблема из всех которые возникнут )
например ...
...
Рейтинг: 0 / 0
Наследование в базе данных
    #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
Наследование в базе данных
    #32369253
Фотография Роман Дынник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в догонку:
У меня всего лишь mysql
ничего страшного :), так называемый слой хп реализуй в виде методов PHP/Java/C#... классов.
Надо отразить таблицы БД на классы с методами. Наследование классов должно соответствовать "наследованию" таблиц.
...
Рейтинг: 0 / 0
Наследование в базе данных
    #32369323
KhasDenis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторесли вы установили MySQL без поддержки транзакций, в этом случае возможны "казусы"
Сейчас как раз пытаюсь это выяснить. У меня mysql 3.23.49, я его не собирал -он из дистрибутива. Таблицу InnoDB создал вроде.
...
Рейтинг: 0 / 0
Наследование в базе данных
    #32370104
StarWind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Роман Дынник
так и поддержка транзакций не поможет...
считываем данные из таблицы например получаем 5
причем считываем в двух транзакциях сразу
обе транзакции инкрементируют это число и обе пытаются вставить 6, а это не правильно!
подчеркну еще раз, нужна генерация уникальных значений на уровне СУБД.

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

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

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

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

Как это правильно организовать для моей задачи?
Буду ОЧЕНЬ благодарен!!!
...
Рейтинг: 0 / 0
Наследование в базе данных
    #36926623
SORMB4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SORMB4,
мда..... почитал что на форуме это очень много расписано, но верного решения пока нет... да и решения, как выясняется, нужно делать под прямую конкретику... Все таки если кто-то предложит вариант решения моей проблемы с аргументированием подхода, скажу большое спасибо!
...
Рейтинг: 0 / 0
Наследование в базе данных
    #36927239
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
Наследование в базе данных
    #36928271
SORMB4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, на связи 1к1 и остановился я. Спасибо за подтверждение моей мысли, ибо по-другому тут без мега наворотов никак.
...
Рейтинг: 0 / 0
Наследование в базе данных
    #36937182
simply_sash
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Роман Дынникничего страшного :), так называемый слой хп реализуй в виде методов PHP/Java/C#... классов.
StarWindнасколько я знаю там нет хранимых процедур... а это плохо...
В MySQL есть хранимые процедуры http://dev.mysql.com/tech-resources/articles/mysql-storedproc.html
...
Рейтинг: 0 / 0
Наследование в базе данных
    #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
Наследование в базе данных
    #36939629
simply_sash
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cat2,

На дату внимания не обратил ;) Тогда так: В MySQL уже есть хранимые процедуры
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Наследование в базе данных
    #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
Наследование в базе данных
    #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]