Иерархия классов и чей class_id в Object

Добрый день.

После прочтения статей остается непонятным вопрос:
имеем иерархию класса, к примеру, 3-х уровневую - чей class_id будет в Object: 1го, 2го или 3го уровня объектов??

Forums: 

Изображение пользователя st.

Не вполне понятен вопрос

В class_id находится идентификатор класса созданного объекта независимо от иерархий и прочего.

Есть к примеру иерархия,

Есть к примеру иерархия, описанная в статье Усова - Object-Товары-Молочные продукты. Все эти классы связаны по id с предком и id сквозной - при создании объекта "Молочные продукты" в таблице "Объекты" генерируется новый id и он последовательно записывается в "Продукты" и "Молочные продукты".

А чей class_id пишется в Object? Продуктов или Молочных продуктов?

Изображение пользователя st.

Значит

Значит проблема связана с выбором типа отображения классов на таблицы. В примере ядра мета4 используется схема "класс соответствует таблице, наследуемые атрибуты НЕ копируются". Поэтому там такой дилеммы нет вовсе.

Если использовать отображение с копированием атрибутов родительского класса, то следует копировать и значение. Соответственно, во всех таблицах class_id из вашего примера будет соответствовать классу "Молочные продукты".

Насколько я понял у Усова

Насколько я понял у Усова тоже не копирутся за исключением id.
Тогда я не пойму как в META в вышеприведенном примере все делается...

Изображение пользователя st.

Это не столь важно

Это не столь важно, когда-то давно Усов мне ответил, что считает отображение с копированием атрибутов наиболее оптимальным по совокупности требований.

В схеме "таблица на класс, атрибуты (кроме ПК) не копируются", принятой в Мета4, псевдокод создания будет такой:

CREATE PROCEDURE МолочныйПродукт_Create @id out, @.... (параметры соответствуют атрибутам)
AS
BEGIN
  SELECT @class_id = class_id FROM Classes WHERE name = 'МолочныйПродукт';
  EXEC Object_Create @id out, @class_id, @... /* параметры, относящиеся только к классу Object */
  EXEC Продукт_Create @id out, @... /* параметры, относящиеся только к классу Продукт */
  INSERT INTO МолочныйПродукт (id, ...)
  VALUES (@id, ... /* параметры, относящиеся только к классу МолочныйПродукт */)
END
...
 

Но ведь id этот одновременно

Но ведь id этот одновременно является id Молочный_продукт и Продукт - почему же в Объекты должен быть class_id Молочный продукт?
У нас по факту создано 2 объекта разных классов с одним id и Объект указывает что это молочный_продукт, а если бы у нас продукт был бы полноценным классом? получается что мы лишаемся возможности найти объект класса Продукт в структуре!?

Изображение пользователя st.

Потому что

Потому что класс создаваемого объекта - "Молочный продукт".

Возможности найти объекты подклассов никуда при этом не исчезает. Например, чтобы выбрать ВСЕ объекты подклассов "Продукт", включая сам класс, есть минимум 2 способа:

  • INNER JOIN Продукт ON Продукт.id = Таблица.id
  • SELECT ... WHERE class_id IN (SELECT class_id FROM Подклассы("Продукт"))

Сложно получается... А если в

Сложно получается...
А если в объекты хранить class_id Продукты а в Продукты поместить поле class_id в котором хранить подкласс продуктов?

Изображение пользователя st.

Что может быть проще?

Что может быть проще?

Выбрать объекты класса "Продукт" и всех его подклассов

SELECT * FROM Продукт

Здесь "Продукт" - таблица в случае копирования наследуемых атрибутов или вид в противном случае

CREATE VIEW Продукт
AS
SELECT ... 
FROM ТОбъект INNER JOIN ТПродукт 
  ON ТОбъект.id = ТПродукт.id
 
CREATE VIEW МолочныйПродукт
AS
SELECT ... 
FROM Продукт INNER JOIN ТМолочныйПродукт 
  ON Продукт.id = ТМолочныйПродукт.id

Выбрать все строки документов, где товаром является МолочныйПродукт и его подклассы

SELECT * 
FROM СтрокаДокумента INNER JOIN ТМолочныйПродукт 
  ON СтрокаДокумента.id_Товар = ТМолочныйПродукт.id

Выбирать из таблиц конечно

Выбирать из таблиц конечно нет ничего сложного, но меня беспокоит идентификация объекта по его id.
Получается если у на иерархия классов то в ТОбъект у нас всегда class_id - это самый последний в иерархии класс?

Изображение пользователя st.

Нет

В ТОбъект class_id соответствует классу данного объекта и только.

какого из иерархии? - в

какого из иерархии? - в иерархии создается одновременно несколько объектов разных классов - чтоб создать объект Молочный_продукт я же сначала создаю объект Продукт, но его class_id почему-то не остается нигде...

Изображение пользователя st.

Еще раз нет

Вы создаете объект одного класса "МолочныйПродукт". Но этот класс хранит свои атрибуты в таблицах, соответствующих его родительским классам.

Множественное наследование не поддерживается, значит объект в каждый момент своей жизни принадлежит только к одному классу.

Поделитесь пожалуйста опытом

Поделитесь пожалуйста опытом - у вас встречалась ли ситуация когда была бы иерархия в которой бы создавались бы самостоятельные объекты (т.е. предок и сам класс создают самостоятельные объекты - не такие как Продукт и Молочный_продукт, а такие где продут можно создавать самостоятельные объекты, не зависящие от Молочный_продукт)?

Изображение пользователя st.

Два класса

Два неабстрактных класса связанные обобщением и оба используемые - редкий случай в проектировании модели предметной области реального мира и повод подумать, нет ли здесь ошибки (в искусственных мирах фреймворков это не так). Ранее упомянутая иерархия Продукт-МолочныйПродукт - это тоже явная ошибка.

Это же случай весьма частый при настройке системы. Например, прикладной разработчик берет уже используемый работающий класс системы, создает на его основе потомка и добавляет к нему атрибут (МолочныйПродукт <- КислоМолочныйПродукт с атрибутом pH). На этом этапе разработки особо выбирать и долго думать не приходится.

Правильно ли я понял, что при

Правильно ли я понял, что при правильном проектировании суперклассы не являются полноценными классами?

Изображение пользователя st.

Можно

Можно и так сказать в большинстве случаев. Разработка достаточно хорошей таксономии - работа уровня научной диссертации.