Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
«Организация бизнес-логики со сложной схемой да...
Search
WebDev
December 06, 2014
Programming
0
100
«Организация бизнес-логики со сложной схемой данных», Тимофей Кукушкин, ТриЛан Вологда
Расскажу о том, какой путь мы прошли, реализуя бизнес-логику сложного enterprise решения.
WebDev
December 06, 2014
Tweet
Share
More Decks by WebDev
See All by WebDev
«Тестирование веб-приложений», Андрей Кишкин, ТриЛан Вологда
webdevconf
0
110
«Еще раз про MVC и веб-фреймворки в enterprise решениях», Дмитрий Кукушкин, ТриЛан Вологда
webdevconf
0
74
Секретный доклад об управлении проектами, Наташа Юматова, Дмитрий Чернов, Трилан
webdevconf
0
77
«Низкокалорийный дизайн. Диета для сайта», Ольга Сбоева, ТриЛан Вологда
webdevconf
0
110
«Стек технологий и приемов при разработке серверной части мобильного приложения», Сергей Аникин, ТриЛан Вологда
webdevconf
0
440
Other Decks in Programming
See All in Programming
LT 2025-06-30: プロダクトエンジニアの役割
yamamotok
0
710
Modern Angular with Signals and Signal Store:New Rules for Your Architecture @enterJS Advanced Angular Day 2025
manfredsteyer
PRO
0
190
ふつうの技術スタックでアート作品を作ってみる
akira888
0
440
Deep Dive into ~/.claude/projects
hiragram
12
2.4k
Google Agent Development Kit でLINE Botを作ってみた
ymd65536
2
220
0626 Findy Product Manager LT Night_高田スライド_speaker deck用
mana_takada
0
150
VS Code Update for GitHub Copilot
74th
2
620
Azure AI Foundryではじめてのマルチエージェントワークフロー
seosoft
0
160
イベントストーミング図からコードへの変換手順 / Procedure for Converting Event Storming Diagrams to Code
nrslib
2
630
『自分のデータだけ見せたい!』を叶える──Laravel × Casbin で複雑権限をスッキリ解きほぐす 25 分
akitotsukahara
2
620
Porting a visionOS App to Android XR
akkeylab
0
280
git worktree × Claude Code × MCP ~生成AI時代の並列開発フロー~
hisuzuya
1
540
Featured
See All Featured
Large-scale JavaScript Application Architecture
addyosmani
512
110k
Typedesign – Prime Four
hannesfritz
42
2.7k
GraphQLとの向き合い方2022年版
quramy
49
14k
The Language of Interfaces
destraynor
158
25k
The Pragmatic Product Professional
lauravandoore
35
6.7k
Facilitating Awesome Meetings
lara
54
6.4k
Agile that works and the tools we love
rasmusluckow
329
21k
Optimising Largest Contentful Paint
csswizardry
37
3.3k
It's Worth the Effort
3n
185
28k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
10
950
Docker and Python
trallard
44
3.5k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
181
53k
Transcript
Организация бизнес логики со сложной схемой данных
Особенности схемы данных заказчика: • Часть данных внешняя, часть “локальная”
• Многоязычность • Простые типы данных • Нет ссылочной целостности
Подсистемы: • Система версионирования • Система блокировок • Система ревизионирования
• API
Как все начиналось
Толстые тупые уродливые контроллеры Class Based Views
• Для каждой модели свое приложение. • Вся обработка и
получение данных в приложениях. • Views отвечают только за взаимодействие пользователя и приложения “Приложения”
class ArticleApp(BaseApp): model = Article multilingual_model = MultilingualArticle common_fields =
['author_id'] multilingual_fields = ['title', 'content'] external_fields = ['author', 'title'] search_fields = ['title'] aliases = {'author_id': 'author'} article_app = ArticleApp()
• Прослойка между системой версионирования и моделью Django ORM •
Для каждой модели свой класс интерфейса. • Работает строго с одним объектом “Интерфейсы”
class ArticleInterface(interfaces.Interface): model = Article multilingual_model = MultilingualArticle common_fields =
['author_id'] multilingual_fields = ['title', 'content'] external_fields = ['author', 'title'] interfaces.register(ArticleInterface)
class ArticleApp(BaseApp): interface_class = ArticleInterface search_fields = ['title'] aliases =
{'author_id': 'author'} article_app = ArticleApp()
• Метаданные фрагментированы • Нет четкого публичного API • Приватное
API течет внаружу Что по-прежнему плохо
Схема данных в YAML формате
Вспомогательный класс для генерации моделей
class ArticleInterface(interfaces.Interface): model = interfaces.Model( 'Article', common_fields=[ fields.IntegerField('id', label='ID', primary_key=True,
source='Site') fields.ForeignKey('author_id', label=u'автор', source='Site', required=True, to=AuthorInterface, property_name='author') ], multilingual_fields=[ fields.TextField('title', label=u'Заголовок', required=True, source='Site', searchable=True) fields.TextField('content', label=u'Содержимое', required=False, source='Local') ], label=u'Статья' ) interfaces.register(ArticleInterface) _Article = ArticleInterface.model _MultilingualArticle = ArticleInterface.multilingual_model
class ArticleApp(BaseApp): interface_class = ArticleInterface article_app = ArticleApp()
class ArticleInterface(interfaces.Interface): name = 'Article' common_fields = [ fields.IntegerField('id', label='ID',
primary_key=True, source='Site') fields.ForeignKey('author_id', label=u'автор', source='Site', required=True, to=AuthorInterface, property_name='author') ] multilingual_fields = [ fields.TextField('title', label=u'Заголовок', required=True, source='Site', searchable=True) fields.TextField('content', label=u'Содержимое', required=False, source='Local') ] label = u'Статья' interfaces.register(ArticleInterface) _Article = ArticleInterface.model _MultilingualArticle = ArticleInterface.multilingual_model
Менеджеры
>>> from articles.models import ArticleInterface >>> objects = ArticleInterface.objects.filter( ...
include_removed=True)[:3] >>> objects [<articles.models.ArticleInterface u'Starbucks'>, <articles.models.ArticleInterface u'Lorem ipsum'>, <articles.models.ArticleInterface u'Dolor sit amet'>] >>> objects.count() 3 >>> for instance in objects: ... print instance.data.id 197 196 195
Переносим все операции над данными в интерфейсы
>>> object = objects[0] >>> object.data.locales['ru'].Title 'Starbucks' >>> version =
object.change( ... user, ... common_data={'author_id': 10}, ... locales_data={'ru': {'title': 'Bartsucks', 'content': 'Lorem ipsum'}} ... ) >>> new_object, version = ArticleInterface.objects.create( ... user, ... common_data={'author_id': 1}, ... locales_data={'ru': {'title': 'foo', 'content': 'bar'}} ... ) >>> type(new_object) articles.models.ArticleInterface
В итоге • Описание схемы данных через интерфейсы полностью отражает
схему данных заказчика • Четкое публичное API • Атомарность операций
Вопросы?