Я занимаюсь разработкой программного обеспечения для создания и хранения макетов печати.
Мой вопрос о моделировании отношений между столбцами и элементами.
Это было бы действительно прямо вперед. Добавьте все свойства как столбцы в таблицу и используйте отношение N: N для моделирования отношения между столбцами и элементами.
Отношение может выглядеть так
column_idELEMENT_IDпорядок
000000010000000010009
000000010000000020012
000000020000000060003
Мне кажется, это не очень привлекательно, поскольку таблица для хранения элементов будет заполнена пустыми записями, например, все font
столбцы будут пустыми для элементов изображения. Будет еще хуже, если я рассмотрю все разные типы элементов, которые у меня есть (около 10).
Преимущество: SQL-запросы относительно просты:
select * from
relation_table R inner join elements E
on R.element_id = E.id
where R.column_id = FIXED_COLUMN_ID
Моделирование элементов было бы довольно простым, просто создайте один столбец для всех свойств элемента класса и добавьте свойства определенного типа элемента, такого как изображение.
Но как насчет моделирования столбца отношения: элемент?
Мой первый подход состоит в том, чтобы попытаться добавить столбец в отношение, которое указывает тип элемента, который будет напрямую отображаться в связанную таблицу:
column_idELEMENT_IDпорядокэлемент ELEMENT_TYPE
000000010000000010012текст
000000010000000020003образ
000000020000000060005образ
Это, конечно, работает, но все sql-запросы для извлечения элементов для определенного столбца будут довольно сложными.
Есть ли подход, который сочетает в себе простоту запросов SQL из идеи № 1 и более точное моделирование базы данных идеи № 2?
Как вы подходите к этой проблеме?
П.С .: При других обстоятельствах я бы переключился на базу данных на базе nosql, но это невозможно 🙁
<?php
// Sample code of element structure
class element {
protected $id;
protected $order;
// more properties, getters and setters...
}
class image extends element {
protected $image;
// more properties, getters and setters...
}
class text extends element {
protected $font;
// more properties, getters and setters...
}
?>
Я думаю, что вам лучше начать с одной таблицы для элементов, а затем добавить таблицы соединений для дополнительной информации, необходимой для различных типов элементов.
Обычно ошибочно думать о моделировании данных как о реальных объектах в дизайне БД, но гораздо лучше сделать шаг назад и моделировать на основе внутренних зависимостей данных. Они часто совпадают (и делают это достаточно часто, чтобы сфокусировать внимание на реальной сущности), но когда вы сталкиваетесь со случаями, когда этого не происходит, это вызывает у вас горе.
Здесь у вас есть проблемы, связанные с запросами и заказами, которые тривиально решить в одной таблице, но у вас будут большие головные боли во многих таблицах.
Позвольте мне сосредоточиться на беспорядочной части: «Различные элементы имеют разные свойства. Например, у изображений есть URL ресурса, у текста — шрифт». Это, как вы говорите, напрашивается на множество обнуляемых столбцов или множество разных таблиц. В любом случае это беспорядок.
Решение … Поместите эти «разные элементы» в коллекцию JSON. Поместите это в столбец и позвольте приложению расшифровать его и использовать материал.
При таком решении структура все еще находится в базе данных, но детали оставлены для приложения. Похоже на справедливый компромисс.
Смотрите другие обсуждения EAV.