Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Связь один-к-одному
|
|||
|---|---|---|---|
|
#18+
Знаю, что эта тема уже поднималась, но хочется кое-что уточнить. Вот приблизительная постановка задачи, которая у меня возникла. Пусть есть некий класс объектов A , и класс объектов B , являющихся "разновидностью" A , но имеющих большее количество атрибутов. Держать их в одной таблице не хочется, и вроде бы естественной является мысль организовать связь 1:1. Поскольку у них есть "подчиненные" объекты, то держать A и B в несвязных таблицах тоже нехорошо. Для юзера эти объекты совершенно разные, то есть просматривать и редактировать A (которые не являются B ) и B он должен отдельно. Опишу для начала то, как я решаю это на данный момент (синтаксис IB'шный, но вроде без особой специфики): Код: 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. Собственно, основная проблема, которую я здесь вижу - это anti-join в V_A , который, по-видимому, может очень сильно тормозить. Сначала я хотел даже сделать примерно так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Какой, по вашему мнению, более правильный вариант? Или, возможно, более правильное решение задачи в целом? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2005, 01:58 |
|
||
|
Связь один-к-одному
|
|||
|---|---|---|---|
|
#18+
автор Не морочь себе голову... делай все в одной... Поставь дополнительно признак-А и выбирай по нему или все... А то завтра понадобится какой-нибудь признак перетаскивать из В->A или наоборот... :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2005, 09:01 |
|
||
|
Связь один-к-одному
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2005, 09:41 |
|
||
|
Связь один-к-одному
|
|||
|---|---|---|---|
|
#18+
LVU CREATE VIEW V_A (A_Id, A_Attrib_1, ...) AS SELECT A.A_Id, A.A_Attrib_1, ... FROM A WHERE NOT EXISTS (SELECT * FROM B WHERE B.B_Id=A.A_Id) Зачем NOT EXISTS ? Все B являются также и A. Поэтому во view, которое представляет A, нужно иметь также и экземпляры B. LVU Какой, по вашему мнению, более правильный вариант? Или, возможно, более правильное решение задачи в целом? Если тебе нужно выделить чистые A, то лучше сделать еще одного наследника от A - скажем, C, который будет играть роль тех объектов, которые сейчас у тебя являются чистыми A. Тогда вместо A и B ты будеш использовать B и C, и обе view будут только с join-ами, без вычитания. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2005, 09:57 |
|
||
|
Связь один-к-одному
|
|||
|---|---|---|---|
|
#18+
Павел Воронцов Код: plaintext 1. 2. 3. 4. Ну и что ты советуешь ? Вычитание - оно все равно вычитание, как его не записывай, в виде NOT EXISTS или в виде LEFT OUTER JOIN. Один фиг долго. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2005, 10:04 |
|
||
|
Связь один-к-одному
|
|||
|---|---|---|---|
|
#18+
olol автор Не морочь себе голову... делай все в одной... Поставь дополнительно признак-А и выбирай по нему или все... А то завтра понадобится какой-нибудь признак перетаскивать из В->A или наоборот... :) Ну , скажем так - совет не продвинутый, туповатенький. Если надо иметь не два класса, а несколько , то тут уже такое все меньше и меньше будет подходить. Но все естественно от задачи зависит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2005, 10:08 |
|
||
|
Связь один-к-одному
|
|||
|---|---|---|---|
|
#18+
При показе класса А в виде списка объекты класса В должны присутствовать, но не быть редактируемыми. Можно сделать форму для редактирования одной записи (одну для А, другую для В, причем форму В можно наследовать от А). В таблице А можно ввести тип, определяющий класс объектов. К тому же если тебе нужны будут только объекты типа А (без наследников), то можно будет список фильтровать по типу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2005, 10:14 |
|
||
|
Связь один-к-одному
|
|||
|---|---|---|---|
|
#18+
MasterZivНу , скажем так - совет не продвинутый, туповатенький. Если надо иметь не два класса, а несколько , то тут уже такое все меньше и меньше будет подходить. Но все естественно от задачи зависит. Ты наверное умник считаешь, что на каждый клас нужно делать: CREATE TABLE В (... CREATE TABLE С (... В этом случае уж лучше признак-B,признак-C... А если нужны разные фильтры для выборки, то и должны быть все признаки не в одной строке, а в виде таблицы перечня свойств... и для них таблица-фильтр... Тогда можно будет спокойно добавлять и A_Attrib_3, A_Attrib_4... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2005, 11:13 |
|
||
|
Связь один-к-одному
|
|||
|---|---|---|---|
|
#18+
LVU Для такой реализации наследования вам стоит почитать про descriminator'ы. А то какая-то частичная реализация получается - осюда и проблемы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2005, 11:35 |
|
||
|
Связь один-к-одному
|
|||
|---|---|---|---|
|
#18+
MasterZivЗачем NOT EXISTS ? Все B являются также и A. Поэтому во view, которое представляет A, нужно иметь также и экземпляры B. С точки зрения "реального мира" (и юзера) есть объекты B , и есть A , которые не B , поэтому не так. Old NickПри показе класса А в виде списка объекты класса В должны присутствовать, но не быть редактируемыми. См. выше. Old NickВ таблице А можно ввести тип, определяющий класс объектов. К тому же если тебе нужны будут только объекты типа А (без наследников), то можно будет список фильтровать по типу. Я в первом посте сказал, что это основной рассматриваемый вариант. Но все-таки денормализация... MasterZivЕсли тебе нужно выделить чистые A, то лучше сделать еще одного наследника от A - скажем, C, который будет играть роль тех объектов, которые сейчас у тебя являются чистыми A. Тогда, теоретически, могут появиться такие A , ктороые не являются ни B , ни C . Да и избыточность получается больше, чем если вводить в A признак. MasterZiv Павел Воронцов Код: plaintext 1. 2. 3. 4. Ну и что ты советуешь ? Вычитание - оно все равно вычитание, как его не записывай, в виде NOT EXISTS или в виде LEFT OUTER JOIN. Один фиг долго. А действительно ли один фиг? По крайней мере, это выглядит изящнее, чем мой вариант. Я просто не уверен в том, насколько одинаково воспримет эти запросы FB'шный оптимизатор. ololА если нужны разные фильтры для выборки, то и должны быть все признаки не в одной строке, а в виде таблицы перечня свойств... и для них таблица-фильтр... Тогда можно будет спокойно добавлять и A_Attrib_3, A_Attrib_4... Все-таки, заводить свои метаданные, и организовывать, по сути, собственную БД поверх существующей, не стоит, если нет реальной необходимости. Хотя в другом месте в этой задаче такая фигня у меня есть. funikovyuriДля такой реализации наследования вам стоит почитать про descriminator'ы. А то какая-то частичная реализация получается - осюда и проблемы А не подскажете, где о них почитать? Что-то я, видно, не смог правильный вопрос гуглю задать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2005, 12:16 |
|
||
|
Связь один-к-одному
|
|||
|---|---|---|---|
|
#18+
На самом деле не все так просто. Нужно анализировать предметную область, если присутствует вероятность изменения типов объектов, их связей или состава, то будет большая головная боль при переделке предложенной структуры. Поясню, если объект А - это объект "свтильник", а В - это объект "светильник настольный", то очевидны проблемы, если наш "завод" вдруг начнет выпускать "стол". А вот если объект А - это "описание товара", а В - "проверенное и дополненное описание товара", то тут возможно расширения не предвидится. В общем случае структуру можно сделать такой: Таблица Объекты id int, идентификатор class_id int, класс объекта Таблица Свойства объектов obj_id идентификатор объекта prop_id идентификатор свойства data varbinary значение свойства Таблица Классификатор объектов id идентификатор класса parent_id идентификатор родительского класса ... Таблица Классификатор свойств id идентификатор свойства type_id тип данных свойства ... Понятное дело, что пример совершенно из другой крайности. Но идеи, думаю есть откуда подчерпнуть. Выборки объектов можно делать хоть по конкретному классу, хоть по нескольким, тормозов не будет. Редактирование объекта организуется индивидуально, по набору доступных для данного объекта свойств. Да и с добавлением новых объектов проблем не будет. Вывод такой: анализируйте предметную область(или читайте ТЗ, здесь оно будет как нельзя кстати) и ищите золотую середину. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2005, 12:20 |
|
||
|
Связь один-к-одному
|
|||
|---|---|---|---|
|
#18+
LVU funikovyuriДля такой реализации наследования вам стоит почитать про descriminator'ы. А то какая-то частичная реализация получается - осюда и проблемы А не подскажете, где о них почитать? Что-то я, видно, не смог правильный вопрос гуглю задать. Вроде нашел, приблизительно: http://blog.hibernate.org/cgi-bin/blosxom.cgi/Gavin%20King/discrimination.html . Но в этой статье, ИМХО, как раз получается приблизительно то же, что у меня, с поправкой от Павла Воронцова, за исключением того, что я не ввозу дискриминатор явно, а использую его неявное значение во VIEW. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2005, 12:38 |
|
||
|
Связь один-к-одному
|
|||
|---|---|---|---|
|
#18+
iLLerПоясню, если объект А - это объект "свтильник", а В - это объект "светильник настольный", то очевидны проблемы, если наш "завод" вдруг начнет выпускать "стол". А вот если объект А - это "описание товара", а В - "проверенное и дополненное описание товара", то тут возможно расширения не предвидится. Вот, очень близко ко второму варианту, на самом деле. iLLerВ общем случае структуру можно сделать такой: ... Подобную штуку предлагал olol (если я правильно его понял), и, как я ему уже сказал, она используется в этом проекте, но в другом месте. Здесь, я уверен, она совершенно не нужна. iLLerВывод такой: анализируйте предметную область(или читайте ТЗ, здесь оно будет как нельзя кстати) и ищите золотую середину. Насчет ТЗ я согласен, но его нет :( Сами ставим, сами пишем... А насчет предметной области - стараемся. Как я уже сказал, расширение номенклатуры объектов здесь невозможно, просто "по построению". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2005, 12:47 |
|
||
|
Связь один-к-одному
|
|||
|---|---|---|---|
|
#18+
Рискну предложить ещё один вариант. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2005, 14:10 |
|
||
|
Связь один-к-одному
|
|||
|---|---|---|---|
|
#18+
Херней маетесь :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2005, 14:41 |
|
||
|
Связь один-к-одному
|
|||
|---|---|---|---|
|
#18+
Павел ВоронцовРискну предложить ещё один вариант. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Интересный вариант, такая себе дополнительная жесткость образуется. Но при этом в B все равно могут быть записи, причем с любым значением TYPE, на которые никто не ссылается. Для моего случая точно не подходит, но если подклассов много - сгодится, наверное. Павел Воронцов Код: plaintext 1. А вот зачем это нужно, я не понял. Мне, по крайней мере, показалось, что "суперкласс" - это B , у него "подклассы" - B1 и B2 . При чем здесь вообще A ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2005, 15:19 |
|
||
|
Связь один-к-одному
|
|||
|---|---|---|---|
|
#18+
Нужно учиться работать с гуглом http://www.google.ru/search?hl=ru&q=discriminator+column&lr= Вот от Versant автор6.3. Inheritance Classes in an inheritance hierarchy can be mapped to the same table (flat) or to different tables (vertical) or any combination of the two strategies. Each class indicates how it is mapped to its superclass. Flat mapping requires the addition of a discriminator or indicator column to the table for the base class to identify the type of each row (except for one special case Section 6.3.6). The default name of the descriminator column is 'jdo_class'. This is optional for vertical mapping. The discriminator column value for each class can be an int or a String. The discriminator column is mapped to a SQL INTEGER if all of the discriminator values are ints, and a SQL VARCHAR otherwise, but can be changed using the Workbench or editing the jdbc-class-id extension (see Section 21.9) in the meta data. The default class-id (or discriminator) value for a class is a 32 bit positive hash of the fully qualified class name but you can also change this using jdbc-class-id extension or by editing class properties in the Workbench. In particular the default can be changed to the fully qualified name of the class or the name without package (see Section 6.3.4). вот кусок документации к hibernate автор 8.1. The Three Strategies Hibernate supports the three basic inheritance mapping strategies. table per class hierarchy table per subclass table per concrete class (some limitations) ... Note that Hibernate's implementation of table-per-subclass requires no discriminator column. Если коротко - discriminator column - это поле определяющее класс к которому принадлежит данная запись-объект ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2005, 15:36 |
|
||
|
Связь один-к-одному
|
|||
|---|---|---|---|
|
#18+
funikovyuriНужно учиться работать с гуглом http://www.google.ru/search?hl=ru&q=discriminator+column&lr= <skip> вот кусок документации к hibernate <skip> Если коротко - discriminator column - это поле определяющее класс к которому принадлежит данная запись-объект Это я видел, но оно довольно малоинформативно. А в статье discrimination.html , которая к hibernate, видимо, какое-то отношение имеет, объясняют доходчиво и на примерах :) У меня, по-видимому, стратегия "table per subclass", в которой, согласно и тому, что читал я, и тому, что писали вы, использовать физическое поле для дискриминатора необязательно. В статье предлагают в таком случае вычислять его примерно так, как советовал Павел Воронцов. Поскольку собственно значение дискриминатора мне использовать не нужно (мне бы только выборку), то фактически, я его неявно ввожу как вычисляемое :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2005, 16:01 |
|
||
|
Связь один-к-одному
|
|||
|---|---|---|---|
|
#18+
LVUА вот зачем это нужно, я не понял. Мне, по крайней мере, показалось, что "суперкласс" - это B , у него "подклассы" - B1 и B2 . При чем здесь вообще A ?Это вариант ссылки на суперкласс. Когда я такое ваял меня спрашивали "А вот как бы сделать так, чтобы была ссылка либо на одну либо на другую таблицу". Такой вот был вопрос. Наличие "объектов" "суперкласса" без конкретных подтипов - проблаема решаемая. Если бы Вы работали с Ораклом и/или МС, я бы подсказал конкретные пути. А ФБ не знаю, увы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2005, 16:29 |
|
||
|
Связь один-к-одному
|
|||
|---|---|---|---|
|
#18+
Павел ВоронцовЭто вариант ссылки на суперкласс. Когда я такое ваял меня спрашивали "А вот как бы сделать так, чтобы была ссылка либо на одну либо на другую таблицу". Такой вот был вопрос. Понятно :) Павел ВоронцовНаличие "объектов" "суперкласса" без конкретных подтипов - проблаема решаемая. Если бы Вы работали с Ораклом и/или МС, я бы подсказал конкретные пути. А ФБ не знаю, увы. Давайте для Оракла и/или МС, с ними я тоже работал. Все это не имеет отношения к моей задаче, т.к. держать практически пустую таблицу для "чистых" объектов A ИМХО глупо, но в целом интересно, какое там решение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2005, 16:36 |
|
||
|
Связь один-к-одному
|
|||
|---|---|---|---|
|
#18+
Павел Воронцов Уважаемый - а CONSRAINT B_UK разве не лишний? LVU У Павла есть дескриминатор - это поле тип. Я за дескриминатор, так как он позволяет работать с иерархиями наследования на стороне сервера БД очень эффективно и практически за даром. Насчет того что hibernate может для table per class работать без него это хорошо - НО этого так просто не сможете вы на стороне сервера без каких-то других систем метаданных ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2005, 16:46 |
|
||
|
Связь один-к-одному
|
|||
|---|---|---|---|
|
#18+
funikovyuri Павел Воронцов Уважаемый - а CONSRAINT B_UK разве не лишний? Рискну ответить за него - без B_UK не удастся сделать B1_FK и B2_FK, т.к. Foreign Key должен "смотреть" либо на Primary Key, либо на Unique (по кр. мере в FB, в остальных не помню. Но это, вроде, логично?) funikovyuri LVU У Павла есть дескриминатор - это поле тип. Я за дескриминатор, так как он позволяет работать с иерархиями наследования на стороне сервера БД очень эффективно и практически за даром. Насчет того что hibernate может для table per class работать без него это хорошо - НО этого так просто не сможете вы на стороне сервера без каких-то других систем метаданных Когда я говорил о предложении Павла, я имел в виду этот вариант anti-join'а. Собственно, anti-join и есть та единственная "система метаданных", которой эта схема отличается от использования дискриминатора. Впрочем, именно к дискриминатору я сколняюсь. Надо будет еще провести тест скорости, насколько этот anti-join тормозит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2005, 17:00 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=32962334&tid=1545988]: |
0ms |
get settings: |
7ms |
get forum list: |
19ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
63ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
80ms |
get tp. blocked users: |
2ms |
| others: | 226ms |
| total: | 419ms |

| 0 / 0 |
