За последние 24 часа нас посетили 17757 программистов и 1651 робот. Сейчас ищут 1009 программистов ...

Хитрая модель

Тема в разделе "Прочие вопросы по PHP", создана пользователем bFree, 7 фев 2013.

  1. bFree

    bFree Активный пользователь

    С нами с:
    17 авг 2008
    Сообщения:
    81
    Симпатии:
    0
    Привет всем.
    Спрашиваю у людей, которые более-менее разбираются в проектировании и уже наработали какие-то Best Practices.

    Предположим, что есть таблица:
    Код (Text):
    1.  
    2. id | subpath | path
    3. 1     NULL        some/path
    4. 2     subpath    some/path
    На неоптимальность хранения данных смотреть не стоит - в данном случае это данность, которую не изменить.

    Итак, у нас есть две сущности: Path и Subpath, то есть модели, то есть классы.
    Соотвественно, когда выбираем из таблицы, то в зависимости от поля subpath надо факторить либо объект Path, либо Subpath.. и Subpath будет наследником Path, т.к. в нем определены еще несколько доп. методов и, что важно, переопределен метод Subpath::save();

    Но мне не нравится это наследование.
    Возможно тут грамотнее будет включение Subpath как часть Path? но в этом случае надо как-то переопределить метод save() и к тому же оставить возможность для типизации этих объектов. Или, может быть, сделать Subpath декоратором?

    Умные люди, посоветуйте, плиз ))
    Детали могу уточнить, если нужно
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    не всё ли равно как это хранить, если по этим полям нет выборок? Если выборки из таблицы есть, то плясать надо от нужной скорости. А что с этими данными происходит после выборки не имеет большого значения.

    я так думаю. =)
     
  3. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    а я нихера непонял. какая связь талоицы в БД и классов. вы что пути до них храните?
     
  4. bFree

    bFree Активный пользователь

    С нами с:
    17 авг 2008
    Сообщения:
    81
    Симпатии:
    0
    Ссори, я действительно непонятно объяснил и пример выбрал неудачный

    то объяснение забыли )

    у нас в системе есть такой объект, как Домен (Domain). Например это google.com. Пользоваиели могут доьавлять домены. Кроме fqdn у него есть и другие характеристики, поэтому это отдельная модель.

    Конечно есть выборки из бд, где это хранится:
    Код (Text):
    1. $Domain = $DomainManger->getByFqdn('google.com');
    2. $Domain->getFqdn(); // google.com
    но пользователи еще могут к домену добавлять поддомены, например, test.google.com. И
    вот и возник вопрос, как это представить в виде модели
     
  5. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    надо исходить из того как это будет использоваться. и сделать модель удобную и гибкую именно в данном контексте.
    например вы пишите что могут добавлять поддомены. ну и что дальше? дальше что они должны с ними делать?
    сохранять, добавлять свои характеристики, делать еще поддомены вложенные(какая вложенность ожидается?), работать со списками этих объектов, искать потомков и родителей, объединять в группы и работать с ними...

    поддомены это суть - дерево. тоесть напрашиваются вложенные структуры. но может вам хватит просто списка чилдренов. хз
    пока мне все еще непонятна сама ЦЕЛь создания этой модели.
     
  6. bFree

    bFree Активный пользователь

    С нами с:
    17 авг 2008
    Сообщения:
    81
    Симпатии:
    0
    runcore, хороший вопрос
    На самом деле операций изменений особо не ожидается. Система многоуровневая и на уровне web-морды особых действий над доменом нету.
    Зато есть разнообразные выборки, для дальнейшего вывода но, они достаточно простые, типа getById или getByOwnerUser
    Вложенности поддоменов на уровне логики модели не ожидается.
    То есть subodmain.domain.ru и sub.subdomain.domain.ru - это один и тот же уровень. Главное отделить основной домен от всех его остальных поддоменов.

    При этом обе сущности хранятся в одной таблице:
    Код (Text):
    1.  
    2. id |      domain        | subdomain
    3. 1     google.com          NULL            
    4. 2     google.com          subdomain    // это будет subdomain.google.com
    5. 3     google.com          sub.subdomain  // sub.subdomain.google.com
    Изначально я сделал модель Domain и модель Subdomain extends Domain
    Но тут возникает косяк: как инстанцировать объекты?
    Если есть какой-то DomainManager::getById(10), то что он должен вернуть? Домен или поддомен? мы же заранее не знаем этого (предположим)
     
  7. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    а что такое Subdomain ?
    это обычный домен, но у которого есть родитель - Domain

    а кто такой Domain?
    это домен где МОГУТ БЫТЬ - поддомены. а могут и не быть.

    тоесть и Domain и Subdomain - это один и тотже класс по сути. объекты созданные на его основе будут отличаться только значениями свойств.
    тоесть тупо подходит практика хранения ИД родителя(домена). и нет нужны в отдельном классе SubDomain
     
  8. bFree

    bFree Активный пользователь

    С нами с:
    17 авг 2008
    Сообщения:
    81
    Симпатии:
    0
    runcore, еще они отличаются способами создания их.
    То есть когда я дергаю DomainManger->addDomain(); то он выполняет (упрощенно):
    Код (Text):
    1.  
    2. $NewDomain = $DomainManager->addDomain("google", ".com")
    3.  
    4. // ... //
    5. class DomainManaer {
    6.     public function addDomain($hostname, $zone) {
    7.           //...//
    8.           // где-то тут проверка, что такого домена еще нет и все такое
    9.           //...//
    10.  
    11.          $Domain = new Domain($hostname, $zone);
    12.          if($Domain->save()) {
    13.               return $Domain;
    14.           }
    15.     }
    16. }
    Собственно метод Domain::save() отличается от Subdomain::save(), т.к, строго говоря, выборка этих сущностей происходит из БД, а вот создание происходит не посредством запросов к БД, а вызовом удаленного сервера
     
  9. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.108
    Симпатии:
    1.243
    Адрес:
    там-сям
    Проблема то системная!

    "Сущностью" применительно к БД обычно называют таблицу, а не колонку. пруф
    Вы признаете, что структура задана криво, но тут же буквально проецируете эту кривизну на классы.

    Надо идти от потребностей, практики использования. А затем отображать классы на базу данных. Пока по описанию непонятно как эти классы-домены будут использоваться.

    Еще раз, пожалуйста, чем отличаются эти два save?
     
  10. bFree

    bFree Активный пользователь

    С нами с:
    17 авг 2008
    Сообщения:
    81
    Симпатии:
    0
    Кто ж спорит ) Но сейчас делать миграцию на другую схему нет возможности, к сожалению.

    Строго говоря, модел ьв моей реализации - некоторое подобие Active Record. К сожалению, когд старый и там до недавнего времени не было даже php 5.3.

    По сути у экземпляра модели есть метод Model::save(), который:
    1. Валидирует модель
    2. Если данные в модели валидны, то дергает Model::_saveAsNew() // protected
    3. Методами Model::_saveAsNew() и отличается домен от поддомена.
    В случае с доменом выполняется (образно):
    Код (Text):
    1.  
    2. protected function _saveAsNew() {
    3.     $RemoteSaver = new RemoteSaver();
    4.     $RemoteSaver->addDomain($this->fqdn, $this->zone);
    5. }
    В случае с поддоменом в RemoteSaver передаются другие параметры.
     
  11. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.108
    Симпатии:
    1.243
    Адрес:
    там-сям
    Раз нужен разный набор параметров, мы можем чуть усложнить метод save: добавить if (домен) один_набор_параметров else другой_набор_параметров. То есть это не является серьезной преградой, если мы захотим объявить ОДИН класс для доменов любого уровня, так?
    Надо ли это делать, я не знаю, просто размышляю. Наследование это не всегда благо.