Привет всем. Спрашиваю у людей, которые более-менее разбираются в проектировании и уже наработали какие-то Best Practices. Предположим, что есть таблица: Код (Text): id | subpath | path 1 NULL some/path 2 subpath some/path На неоптимальность хранения данных смотреть не стоит - в данном случае это данность, которую не изменить. Итак, у нас есть две сущности: Path и Subpath, то есть модели, то есть классы. Соотвественно, когда выбираем из таблицы, то в зависимости от поля subpath надо факторить либо объект Path, либо Subpath.. и Subpath будет наследником Path, т.к. в нем определены еще несколько доп. методов и, что важно, переопределен метод Subpath::save(); Но мне не нравится это наследование. Возможно тут грамотнее будет включение Subpath как часть Path? но в этом случае надо как-то переопределить метод save() и к тому же оставить возможность для типизации этих объектов. Или, может быть, сделать Subpath декоратором? Умные люди, посоветуйте, плиз )) Детали могу уточнить, если нужно
не всё ли равно как это хранить, если по этим полям нет выборок? Если выборки из таблицы есть, то плясать надо от нужной скорости. А что с этими данными происходит после выборки не имеет большого значения. я так думаю. =)
Ссори, я действительно непонятно объяснил и пример выбрал неудачный то объяснение забыли ) у нас в системе есть такой объект, как Домен (Domain). Например это google.com. Пользоваиели могут доьавлять домены. Кроме fqdn у него есть и другие характеристики, поэтому это отдельная модель. Конечно есть выборки из бд, где это хранится: Код (Text): $Domain = $DomainManger->getByFqdn('google.com'); $Domain->getFqdn(); // google.com но пользователи еще могут к домену добавлять поддомены, например, test.google.com. И вот и возник вопрос, как это представить в виде модели
надо исходить из того как это будет использоваться. и сделать модель удобную и гибкую именно в данном контексте. например вы пишите что могут добавлять поддомены. ну и что дальше? дальше что они должны с ними делать? сохранять, добавлять свои характеристики, делать еще поддомены вложенные(какая вложенность ожидается?), работать со списками этих объектов, искать потомков и родителей, объединять в группы и работать с ними... поддомены это суть - дерево. тоесть напрашиваются вложенные структуры. но может вам хватит просто списка чилдренов. хз пока мне все еще непонятна сама ЦЕЛь создания этой модели.
runcore, хороший вопрос На самом деле операций изменений особо не ожидается. Система многоуровневая и на уровне web-морды особых действий над доменом нету. Зато есть разнообразные выборки, для дальнейшего вывода но, они достаточно простые, типа getById или getByOwnerUser Вложенности поддоменов на уровне логики модели не ожидается. То есть subodmain.domain.ru и sub.subdomain.domain.ru - это один и тот же уровень. Главное отделить основной домен от всех его остальных поддоменов. При этом обе сущности хранятся в одной таблице: Код (Text): id | domain | subdomain 1 google.com NULL 2 google.com subdomain // это будет subdomain.google.com 3 google.com sub.subdomain // sub.subdomain.google.com Изначально я сделал модель Domain и модель Subdomain extends Domain Но тут возникает косяк: как инстанцировать объекты? Если есть какой-то DomainManager::getById(10), то что он должен вернуть? Домен или поддомен? мы же заранее не знаем этого (предположим)
а что такое Subdomain ? это обычный домен, но у которого есть родитель - Domain а кто такой Domain? это домен где МОГУТ БЫТЬ - поддомены. а могут и не быть. тоесть и Domain и Subdomain - это один и тотже класс по сути. объекты созданные на его основе будут отличаться только значениями свойств. тоесть тупо подходит практика хранения ИД родителя(домена). и нет нужны в отдельном классе SubDomain
runcore, еще они отличаются способами создания их. То есть когда я дергаю DomainManger->addDomain(); то он выполняет (упрощенно): Код (Text): $NewDomain = $DomainManager->addDomain("google", ".com") // ... // class DomainManaer { public function addDomain($hostname, $zone) { //...// // где-то тут проверка, что такого домена еще нет и все такое //...// $Domain = new Domain($hostname, $zone); if($Domain->save()) { return $Domain; } } } Собственно метод Domain::save() отличается от Subdomain::save(), т.к, строго говоря, выборка этих сущностей происходит из БД, а вот создание происходит не посредством запросов к БД, а вызовом удаленного сервера
Проблема то системная! "Сущностью" применительно к БД обычно называют таблицу, а не колонку. пруф Вы признаете, что структура задана криво, но тут же буквально проецируете эту кривизну на классы. Надо идти от потребностей, практики использования. А затем отображать классы на базу данных. Пока по описанию непонятно как эти классы-домены будут использоваться. Еще раз, пожалуйста, чем отличаются эти два save?
Кто ж спорит ) Но сейчас делать миграцию на другую схему нет возможности, к сожалению. Строго говоря, модел ьв моей реализации - некоторое подобие Active Record. К сожалению, когд старый и там до недавнего времени не было даже php 5.3. По сути у экземпляра модели есть метод Model::save(), который: 1. Валидирует модель 2. Если данные в модели валидны, то дергает Model::_saveAsNew() // protected 3. Методами Model::_saveAsNew() и отличается домен от поддомена. В случае с доменом выполняется (образно): Код (Text): protected function _saveAsNew() { $RemoteSaver = new RemoteSaver(); $RemoteSaver->addDomain($this->fqdn, $this->zone); } В случае с поддоменом в RemoteSaver передаются другие параметры.
Раз нужен разный набор параметров, мы можем чуть усложнить метод save: добавить if (домен) один_набор_параметров else другой_набор_параметров. То есть это не является серьезной преградой, если мы захотим объявить ОДИН класс для доменов любого уровня, так? Надо ли это делать, я не знаю, просто размышляю. Наследование это не всегда благо.