Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
«Организация бизнес-логики со сложной схемой да...
Search
WebDev
December 06, 2014
Programming
120
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
«Организация бизнес-логики со сложной схемой данных», Тимофей Кукушкин, ТриЛан Вологда
Расскажу о том, какой путь мы прошли, реализуя бизнес-логику сложного enterprise решения.
WebDev
December 06, 2014
More Decks by WebDev
See All by WebDev
«Тестирование веб-приложений», Андрей Кишкин, ТриЛан Вологда
webdevconf
0
120
«Еще раз про MVC и веб-фреймворки в enterprise решениях», Дмитрий Кукушкин, ТриЛан Вологда
webdevconf
0
83
Секретный доклад об управлении проектами, Наташа Юматова, Дмитрий Чернов, Трилан
webdevconf
0
81
«Низкокалорийный дизайн. Диета для сайта», Ольга Сбоева, ТриЛан Вологда
webdevconf
0
120
«Стек технологий и приемов при разработке серверной части мобильного приложения», Сергей Аникин, ТриЛан Вологда
webdevconf
0
460
Other Decks in Programming
See All in Programming
iOSDC2026登壇資料.pdf
riofujimon
0
180
AWS DevOps Agentで インシデント対応をAIに任せたい
honmarkhunt
7
3.1k
Kiroで創り、AgentCoreで繋ぐ!AWSで実践する「AI-DLC」から「AIエージェント統合」までの最新地図
licux
4
770
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
260
モデルのリファクタリングが難しいと思ったら、そもそも複雑だったのはビジネス仕様だった ? / is-the-business-domain-the-real-complexity
hatsu38
0
390
The Rails Doctrine Decade
koic
2
350
Intent as Code
shoppingjaws
6
1.1k
難しいけど、読めた。- OSSの入口に立った話。
sts11142
0
120
個人開発基盤をまるごとCloudflareに引っ越して爆速で総合的体験を向上させた話
tinykitten
0
200
20260914 AIエージェント時代のPlatform Engineering LLM基盤とプロダクトの責務境界線
kanfab1
7
2.2k
MVNOの申込からeSIM開通までをiOSアプリでつなぐ- 本人確認・MNP・通信事業者基盤をまたぐ実装
satotakeshi
0
470
選挙速報を多くのユーザーへ 届ける Live Activities 設計
hamayokokuririn
0
160
Featured
See All Featured
Balancing Empowerment & Direction
lara
6
1.3k
Code Review Best Practice
trishagee
74
20k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
340
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1.1k
Music & Morning Musume
bryan
48
7.4k
How to make the Groovebox
asonas
2
2.4k
Art, The Web, and Tiny UX
lynnandtonic
304
22k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Large-scale JavaScript Application Architecture
addyosmani
515
110k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
23k
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
410
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.8k
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 • Атомарность операций
Вопросы?