|
|
|
Наследование в базе данных
|
|||
|---|---|---|---|
|
#18+
В системе имеем следующие сущности manager, realtor, seller и buyer. Все они являются пользователями моей системы, т.е. все они user'ы. При регистрации каждый из них указывает ,помимо общей для каждого пользователя информации, специфическую для каждой роли. Как правильней спроектировать бд? Есть вариант просто четыре таблицы manager, realtor, seller и buyer. Но в этом случае при "определении/подсчете" какой нибудь общей статистики по пользователям придется по всем таблицам бродить. Еще вариант создаем таблицы manager, realtor, seller ,buyer и user. Таблица realtor(seller, buyer) имеет внешний ключ на user. Но здесь insert какой то некрасивый получается, нужно вставить половину введеной пользователем информации в одну таблицу, а половину в другую, причем в realtor.user_id надо вставить user.id, который автоинкремент. помогите торможу ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.01.2004, 18:21 |
|
||
|
Наследование в базе данных
|
|||
|---|---|---|---|
|
#18+
Наследование реализуется в виде связи 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- выходной параметр хп ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.01.2004, 20:14 |
|
||
|
Наследование в базе данных
|
|||
|---|---|---|---|
|
#18+
Роман Дынник и где ты увидел что у человека MS SQL? В других СУБД твой синтаксис уже не пройдет. А вообще твоя мысль дельная. Можно пойти еще далее и посмотреть, может стоит объеденить таблицы manager, realtor, seller, buyer? но тут надо уже смотреть что в них и какую информацию они несут... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2004, 07:52 |
|
||
|
Наследование в базе данных
|
|||
|---|---|---|---|
|
#18+
Интересно, а продавец не может быть одновременно и покупателем? ...эт так между прочим... вообще должны быть две ключевых таблицы юзеров и сделок. и нефиг чушь пороть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2004, 10:18 |
|
||
|
Наследование в базе данных
|
|||
|---|---|---|---|
|
#18+
в таблице user помимо всего прочего можно держать информацию о пользователях системы... А посему резонно вынести людей (всех) в отдельную таблицу. Там будет самый обычный набор атрибутов, типа ФИО и тому подобной лабуды. (Аккаунт в проге, либо, по необходимости в этом поле можно поместить что это не пользователь системы) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2004, 10:31 |
|
||
|
Наследование в базе данных
|
|||
|---|---|---|---|
|
#18+
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 без автоинкремента и самому за уникальностью следить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2004, 16:18 |
|
||
|
Наследование в базе данных
|
|||
|---|---|---|---|
|
#18+
так это же самая простая проблема из всех которые возникнут ) ты главное назови СУБД какая для MS SQL тебе сказали как... есть методы для Oracle, Interbase, других баз. Я думаю класическим примером будет следующее 1) Зовем следующее значение генератора (сиквенса или чего-то аналогичного) 2) Вставляем запись в главную таблицу, используя значение из п.1 3) Вставляем запись в подчиненную таблицу, используя значение из п.1 "И будет все хорошо, как у меня" (с) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.01.2004, 03:26 |
|
||
|
Наследование в базе данных
|
|||
|---|---|---|---|
|
#18+
Базу я назвал - mysql ... create table user (id int(4) PRIMARY KEY AUTO_INCREMENT ... ) sequence я не создаю напрямую, как осуществить твой пункт 1 ? или создать этот самый sequence ? >так это же самая простая проблема из всех которые возникнут ) например ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.01.2004, 10:47 |
|
||
|
Наследование в базе данных
|
|||
|---|---|---|---|
|
#18+
Для 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 для первичного ключа ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.01.2004, 11:43 |
|
||
|
Наследование в базе данных
|
|||
|---|---|---|---|
|
#18+
в догонку: У меня всего лишь mysql ничего страшного :), так называемый слой хп реализуй в виде методов PHP/Java/C#... классов. Надо отразить таблицы БД на классы с методами. Наследование классов должно соответствовать "наследованию" таблиц. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.01.2004, 11:53 |
|
||
|
Наследование в базе данных
|
|||
|---|---|---|---|
|
#18+
авторесли вы установили MySQL без поддержки транзакций, в этом случае возможны "казусы" Сейчас как раз пытаюсь это выяснить. У меня mysql 3.23.49, я его не собирал -он из дистрибутива. Таблицу InnoDB создал вроде. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.01.2004, 12:43 |
|
||
|
Наследование в базе данных
|
|||
|---|---|---|---|
|
#18+
Роман Дынник так и поддержка транзакций не поможет... считываем данные из таблицы например получаем 5 причем считываем в двух транзакциях сразу обе транзакции инкрементируют это число и обе пытаются вставить 6, а это не правильно! подчеркну еще раз, нужна генерация уникальных значений на уровне СУБД. KhasDenis Сорри зе заметил про СУБД... насколько я знаю там нет хранимых процедур... а это плохо... А проблемы, у каждого свои, но они тем не менее всегда возникают :)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.01.2004, 03:27 |
|
||
|
Наследование в базе данных
|
|||
|---|---|---|---|
|
#18+
2StarWind Поддержка транзакций поможет - если Transaction Isolation Level >= Repeatable Read - другой вопрос - какой ценой :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.01.2004, 09:39 |
|
||
|
Наследование в базе данных
|
|||
|---|---|---|---|
|
#18+
а клиента к базе данных на чем пишите? В принципе можно создать что-то типа критической секции (как в многопоточном приложении) и разрулить так. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2004, 10:16 |
|
||
|
Наследование в базе данных
|
|||
|---|---|---|---|
|
#18+
2AAron Да бросьте, я бы лучше посмотрел в сторону GUID или своих ключей создаваемых например по времени или еще какие-нибудь алгоритмы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2004, 10:28 |
|
||
|
Наследование в базе данных
|
|||
|---|---|---|---|
|
#18+
Здравствуйте, уважаемые любители БД! Хотелось бы поднять тему, т.к. столкнулся с аналогичной проблемой. Есть каталог инструментов и каталог удобрений, всё это вещи. у каждой вещи есть общие параметры. У инструментов + свои, у удобрений + свои. Есть люди. Каждый человек может иметь несколько вещей различного типа. Например, 3 лопаты, 5 удобрений "майский жук" и 2 грабли. Каталогов ограниченное количество. По общим характеристикам есть много запросов, например стоимость всех вещей пользователя. Вопрос: как реализовать в mysql? (имхо субд тут не оч большое значение играет, пусть это будет мускл) На мой взгляд, это наследование. Во втором посте предлагается решение такое: создаем 2 таблицы: пользователь-удобрение, пользователь-инструмент и таблицу вещь. в эти две таблицы опускаем первичные ключи из вещи. Т.е. при добавлении вещи, добавляется в 2 таблицы: 1 -в вещь, 2 - в юзер-инструмент или в юзер-удобрение, по типу вещи. Получаем связи юзер-что-то И вещь 1 к 1, что плохо и дублирование инфы по владельцам вещи в ВЕЩИ и в юзер-что-то. Как это правильно организовать для моей задачи? Буду ОЧЕНЬ благодарен!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.10.2010, 20:12 |
|
||
|
Наследование в базе данных
|
|||
|---|---|---|---|
|
#18+
SORMB4, мда..... почитал что на форуме это очень много расписано, но верного решения пока нет... да и решения, как выясняется, нужно делать под прямую конкретику... Все таки если кто-то предложит вариант решения моей проблемы с аргументированием подхода, скажу большое спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.10.2010, 20:34 |
|
||
|
Наследование в базе данных
|
|||
|---|---|---|---|
|
#18+
можно еще так: Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.10.2010, 10:52 |
|
||
|
Наследование в базе данных
|
|||
|---|---|---|---|
|
#18+
Да, на связи 1к1 и остановился я. Спасибо за подтверждение моей мысли, ибо по-другому тут без мега наворотов никак. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.10.2010, 16:36 |
|
||
|
Наследование в базе данных
|
|||
|---|---|---|---|
|
#18+
Роман Дынникничего страшного :), так называемый слой хп реализуй в виде методов PHP/Java/C#... классов. StarWindнасколько я знаю там нет хранимых процедур... а это плохо... В MySQL есть хранимые процедуры http://dev.mysql.com/tech-resources/articles/mysql-storedproc.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2010, 20:26 |
|
||
|
Наследование в базе данных
|
|||
|---|---|---|---|
|
#18+
simply_sash В MySQL есть хранимые процедуры http://dev.mysql.com/tech-resources/articles/mysql-storedproc.html авторРоман Дынник Member Откуда: москва Сообщений: 2887 в догонку: У меня всего лишь mysql ничего страшного :), так называемый слой хп реализуй в виде методов PHP/Java/C#... классов. Надо отразить таблицы БД на классы с методами. Наследование классов должно соответствовать "наследованию" таблиц. 6 янв 04, 11:53 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.11.2010, 18:41 |
|
||
|
Наследование в базе данных
|
|||
|---|---|---|---|
|
#18+
Cat2, На дату внимания не обратил ;) Тогда так: В MySQL уже есть хранимые процедуры ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2010, 20:37 |
|
||
|
Наследование в базе данных
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2014, 20:27 |
|
||
|
Наследование в базе данных
|
|||
|---|---|---|---|
|
#18+
specialist_, Все эти паттерны (не только TPT) были очень давно описаны Фаулером, задолго до того как появились на указанных ресурсах. Поэтому, лучше будет обратиться к первоисточнику: Single Table Inheritance (278) , Class Table Inheritance (285) , Concrete Table Inheritance (293) http://martinfowler.com/eaaCatalog/index.html Во избежании потенциальной "бредятины" и флейма на эту тему, топик я закрою. Тем не менее приведенные выше ссылки будут полезны для понимания общей терминологии и приведения к общему знаменателю различных "изобретений". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2014, 23:19 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=32368121&tid=1540806]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
57ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
61ms |
get tp. blocked users: |
1ms |
| others: | 14ms |
| total: | 173ms |

| 0 / 0 |

Извините, этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
... ля, ля, ля ...