NoSQL с ColdFusion, Bean + Service + DAO & OOP или старый добрый Array / Struct & Procedural? - PullRequest
4 голосов
/ 07 января 2011

Как вы разрабатываете базовую модель CF с NoSQL, которая проста, гибка, эффективна и чиста?

Поскольку документ NoSQL не имеет фиксированной схемы, такой как строка SQL, он не очень хорошо подходит для объектовкоторые довольно статичны.Поэтому типичная архитектура ООП Bean + DAO + Service, похоже, не очень подходит.

Я думаю об использовании простого старого Struct'а, но потом я не могу добавить к нему поведение, и он собирается создать весь проект.очень процедурный, что может быть не плохо?

Однако, если я просто использую простую старую структуру, реализации БД просочились повсюду, включая слой View ...

Или ...перевести массив в объект Query CF для слоя View?

Комментарий?Идея?Предложение?

Спасибо!

Ответы [ 2 ]

3 голосов
/ 07 января 2011

Я написал пару приложений на CF, которые используют хранилища данных NoSQL - одно использует хранилище данных Google App Engine, а другое - MongoDB.

В обоих случаях я сделал CFC для своих объектов.Но я использовал доморощенный объектный «каркас», который использует onMissingMethod для средств доступа и cfproperty с множеством пользовательских метаданных для определения свойств объектов.

Например, это все, что мне НУЖНО определить для модели,если у него нет собственной бизнес-логики:

<cfcomponent output="false" persistentLayer="GAE" persistentClass="asana" extends="com.bespokelogic.framework.BaseModel">
    <cfproperty name="id" type="string" persistentDatatype="string" settable="true" gettable="true" required="true">
    <cfproperty name="deckSet" type="string" persistentDatatype="string" settable="true" gettable="true" default="basic">
    <cfproperty name="englishName" type="string" persistentDatatype="string" settable="true" gettable="true">
    <cfproperty name="traditionalName" type="string" persistentDatatype="string" settable="true" gettable="true">
    <cfproperty name="pronunciation" type="string" persistentDatatype="string" settable="true" gettable="true">
    <cfproperty name="anatomicalFocus" type="array" persistentDatatype="array" settable="true" gettable="true" default="#arrayNew(1)#">
    <cfproperty name="therapeuticFocus" type="array" persistentDatatype="array" settable="true" gettable="true" default="#arrayNew(1)#">
    <cfproperty name="benefits" type="string" persistentDatatype="string" settable="true" gettable="true">
    <cfproperty name="variations" type="string" persistentDatatype="string" settable="true" gettable="true">
    <cfproperty name="contraindications" type="array" persistentDatatype="array" settable="true" gettable="true" default="#arrayNew(1)#">
    <cfproperty name="skill" type="string" persistentDatatype="string" settable="true" gettable="true">
    <cfproperty name="instructions" type="string" persistentDatatype="string" settable="true" gettable="true">
</cfcomponent>

Все CFC расширяют базовую модель, которая имеет методы проверки, сериализации, десериализации и виртуального метода получения / установки.

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

Затем я бы написал сервис для каждой из моделей, использующих уровень персистентности.

В результате модели знают, как сериализовать данные своих свойств, а уровень сохраняемости знает, как поместить их в хранилище данных.

Так что, в некотором смысле, это не объектно-реляционный менеджер, а скорее менеджер объектных документов.

Фреймворк гораздо более полнофункциональный в реальности, поскольку мой дизайн заключался в том, чтоЯ беру некоторые модели и сохраняю их в SQL, некоторые в NoSQL, все в одном приложении - и я могу поменять базовое хранилище данных без перекодирования приложения.Это был частичный успех.

В вашем случае, если вы используете одно хранилище данных, вы можете пропустить все эти сложные вещи.

Вам просто нужен базовый объект, который знает, как сериализоватьи десериализовать модели, и вы получите геттер / сеттер.Решите, как вы хотите хранить данные свойств в CFC.Я использовал структуру с именем "variables.instance._properties {}"

Затем напишите сервис для ваших моделей, который имеет методы "put" и "fetch".Например, метод «put» берет модель, вызывает для нее метод «serialize», чтобы превратить ее в JSON, а затем вставляет в Mongo.Метод «fetch» ​​получает запись Mongo, создает новый экземпляр CFC и передает запись Mongo методу десериализации.

Это было довольно бессвязно ...

TL; DR: «Объекты в CF (как они есть) на самом деле не являются статичными. Используйте CFC. Используйте onMissingMethod, чтобы разрешить динамические свойства. Храните свойства таким образом, чтобы сериализовать и десериализовать их в формате (обычно JSON), которыйлегко усваивается вашим хранилищем данных. Напишите простой слой постоянства, который получает и помещает документы в / из хранилища данных. Напишите простые сервисы, которые реализуют ваш уровень сохраняемости и принимают и возвращают вам динамические модели.

CF довольно хорошо подходит для NoSQLпо моему.

0 голосов
/ 27 января 2011

Я рассчитался с объектом Proxy (который имеет структуру embed 'instance').Слой DAO просто использует getMemento () & setMemento ()

Я также использовал объект Iterator для перебора массива результатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...