Как мне разделить мой SQL и бизнес-логику в этом примере? - PullRequest
1 голос
/ 03 июня 2011

Я искал помощи в Интернете о том, как спроектировать мои php-классы для разделения моей бизнес-логики и уровней данных. Я начал проектировать класс, который мне показался довольно крутым, но затем обнаружил PDO и ADODB, и у меня был приятный момент, когда я понял, что воссоздаю колесо. Моя проблема сейчас в том, что я до сих пор не понимаю, как разделить свою логику и все мои SQL-запросы.

Я вычеркнул почти все из своей схемы БД и записал эти две таблицы, потому что я думаю, что их будет довольно легко понять. Допустим, у меня есть файлы с путем, где они сохранены на моем сервере, которые находятся в каталогах (эти каталоги могут быть в других каталогах). Допустим, мне понадобятся базовые функции, такие как получение корневого каталога из одного из моих файлов или получение списка каталогов внутри текущего каталога.

+--------------------+ +----------------+
| Files              | | Directories    |
+--------------------+ +----------------+
| id                 | | id             |
| name               | | name           |
| path               | | directory_id   |
| directory_id       | +----------------+
+--------------------+

Будет ли хорошо спроектированный класс выглядеть так:

class Files {
    public function __construct( $file_id ) {}
    public function getDirectory() {}
    public function getRootDirectory() {}
    public function getPath() {}
    public function move( $directory_id ) {}
}

class Directories {
    public function __construct( $directory_id ) {}
    public function getRootDirectory() {}
    public function move( $directory_id ) {}
    public function listContent() {}
}

Где я мог бы получить все данные для моих объектов в конструкторе, используя идентификатор, переданный через конструктор? Должен ли я передать объект PDO в конструктор, или я пропустил какой-то ценный шаблон проектирования? Должен ли весь SQL быть здесь жестко закодирован? Одна вещь, которую я получаю с PDO, - это то, что я могу очень легко переключаться с MySQL на MSSQL, но у обоих есть различия в синтаксисе их SQL, так что все равно не вызовет у меня проблем?

Я знаю, что это более теоретические вопросы без ОДНОГО хорошего ответа, но мне не хватает коллег по работе, чтобы обсудить это (я не шучу, когда говорю, что они даже не знают, что такое шаблон проектирования), поэтому я обнаруживаю, что обращаюсь к паутина. Если мой вопрос слишком расплывчатый, не стесняйтесь предложить хорошее место для дискуссий, я мог бы спросить такого рода вещи, и я был бы чрезвычайно благодарен:)

Ответы [ 2 ]

2 голосов
/ 03 июня 2011

Трудно сказать, насколько это применимо к вашей реальной ситуации, но вы, вероятно, должны посмотреть, что ORM (Object-Relational Mapping) может сделать для вас. Существует множество полезных ORM-решений, которые могут упростить эту задачу. Конечно, они не подходят для каждого решения, но ORM могут помочь вам реализовать вашу логику на среднем уровне, где она (обычно) принадлежит.

1 голос
/ 03 июня 2011

Как следует из вашего комментария, если вы хотите, чтобы ваш SQL работал со всеми DMBS, я думаю, вы можете использовать некоторый уровень абстракции SQL.

Я предлагаю вам Zend_DB_Select http://framework.zend.com/manual/en/zend.db.select.html

Если вы прочитали его функцию, то заявлено:

  • независимая от базы данных абстракция некоторых частей SQL-запроса;
...