BG Development


Страници: (3) [1] 2 3   ( Първото ново мнение ) Reply to this topicStart new topicStart Poll

> Въпрос към DDD джедаите :)
kapitancho
Публикувано на: 28-12-2017, 14:11
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 1116
Регистриран на: 26.02.05



Имам един интересен казус и би ми било интересно да чуя мнението на колегите, които са фенове на DDD.

В общи линии става въпрос за just-for-fun проект, в който тествам различни концепции и ще взема една малка част, върху която да задам въпроса си:

Нека имаме Entity - Category (id, name, is_active), което се пада и Aggregate Root, като вътре е още CategoryText (id, title, is_active, category_id, language_id). Т.е., имаме категории, които се казват по различен начин на различни езици.

Въпреки, че полетата изглеждат като прясно излезли от база данни (така си е), то в имплементацията ми си се ползват съответните Repository-та и данните се получават или пращат от/към база, файл, памет и REST Service. Да си го кажем, CRUD-ът бачка идеално.

По естествен начин идва и желанието по даден language_id, да се извадят всички активни категории, заедно със заглавията им за дадения език. Погледнато откъм база данни, заявката е елементарна, а и при друг data storage, извличането на правилните данни не е нещо особено.

Тук идва и въпросът - как бихте оформили така полученият набор от данни (имаме Collection от обекти, които имат name, title и евентуално други полета от Category и CategoryText.

Въпреки, че имам 3-4 конкуриращи се варианта, няма да ги споменавам, защото ми се иска да чуя мнението ви. Благодаря предварително!


--------------------
®...¢↓"←—¬ªº±£™×÷⁄...©
PMEmail Poster
Top
Fly
Публикувано на: 28-12-2017, 14:22
Quote Post



Име: Димитър Костов
Група: Потребител
Ранг: Почетен член

Мнения: 3988
Регистриран на: 02.02.07



Спрях да чета на "Нека имаме Entity - Category (id, name, is_active), което се пада и Aggregate Root, като вътре е още CategoryText (id, title, is_active, category_id, language_id)"

Що за глупости са това


PMEmail Poster
Top
kapitancho
Публикувано на: 28-12-2017, 14:31
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 1116
Регистриран на: 26.02.05



QUOTE (Fly @ 28-12-2017, 14:22)
Спрях да чета на "Нека имаме Entity - Category (id, name, is_active), което се пада и Aggregate Root, като вътре е още CategoryText (id, title, is_active, category_id, language_id)"

Що за глупости са това

Ползвам термините от DDD, нищо повече. Пък дори и някоя дума да не е употребена съвсем точно, мисля, че е ясно за какво става въпрос.


--------------------
®...¢↓"←—¬ªº±£™×÷⁄...©
PMEmail Poster
Top
Fly
Публикувано на: 28-12-2017, 14:40
Quote Post



Име: Димитър Костов
Група: Потребител
Ранг: Почетен член

Мнения: 3988
Регистриран на: 02.02.07



Да приемем, че този дизайн на базата не е сгрешен, не разбирам въпроса. В Rails и в пословично счупената според някои ActiveRecord/Arel:

CODE
category = Category.includes(:category_texts).find_by(language_id: 5, is_active: true)

category е object тип Category

CODE
category.category_texts

Колекция от CategoryText обекти

Та какъв е върпоса ?

Това мнение е било редактирано от Fly на 28-12-2017, 14:50
PMEmail Poster
Top
kapitancho
Публикувано на: 28-12-2017, 14:56
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 1116
Регистриран на: 26.02.05



Ако имаме заявка от вида:
CODE

SELECT c.name, ct.title FROM categories c JOIN category_texts ct ON c.id = ct.category_id WHERE c.is_active = 1 AND ct.is_active = 1 AND ct.language_id = 123

- ще получим масив с елементи.

Тези елементи не са нито от тип Category (title няма работа там), нито от тип CategoryText (name няма работа там). Обаче е много удобно стойностите да са заедно. Въпросът е, как е най-добре да са структурирани.

Примерно, мога спокойно да ги пратя като
CODE

{"result": [
{"name":"name1","title":"title1"},
...
{"name":"nameN","title":"titleN"}
]}

вместо примерно нещо от сорта на:
CODE

{"result": [
{"name":"name1",{texts:[{"title":"title1"}]},
...
{"name":"nameN",{texts:[{"title":"titleN"}]},
]}


Разбира се, това е само начин на представяне на данните, но въпреки това ми се струва излишно да пълня обекта от тип Category с колекция от CategoryText, която съдържа само един елемент.

Примерът е прост, но нищо не пречи да има сценарий, в който имаме примерно 7 JOIN-а и всеки запис идва от базата като flat обект, който съдържа стойности от всяка от таблиците.
Какво правим тогава?

Това мнение е било редактирано от kapitancho на 28-12-2017, 15:00


--------------------
®...¢↓"←—¬ªº±£™×÷⁄...©
PMEmail Poster
Top
Fly
Публикувано на: 28-12-2017, 15:02
Quote Post



Име: Димитър Костов
Група: Потребител
Ранг: Почетен член

Мнения: 3988
Регистриран на: 02.02.07



За това си има object mapper-и, за да не ти се пръсне главата от подобни мисли. Както ти написа, презентацията е отделна задачка

Това мнение е било редактирано от Fly на 28-12-2017, 15:03
PMEmail Poster
Top
Bender
Публикувано на: 28-12-2017, 15:10
Quote Post



Име:
Група: Форумен член
Ранг: Почетен член

Мнения: 4993
Регистриран на: 19.06.14



1. Вие сте синове на Господа, вашия Бог; не правете резки по тялото си и не стрижете косата над очите си за умряло;
2. защото ти си свет народ за Господа, твоя Бог, и Господ тебе избра да бъдеш Негов собствен народ от всички народи, които са на земята.
3. Не яж нищо нечисто.
4. Ето какъв добитък можете да ядете: волове, овци, кози,
5. елен, сърна, бивол, кошута, зубър, орикс, жираф.
6. Всеки добитък, който има раздвоени копита и на двете копита дълбок разрез, и който добитък преживя, него яжте.
7. От ония, които преживят и имат раздвоени копита с дълбок разрез, не яжте само: камила, заек и скокливата мишка, защото макар те и да преживят, но техните копита са нераздвоени: те са нечисти за вас;
8. и свинята, защото копитата й са раздвоени, ала не преживя: тя е нечиста за вас; месото им не яжте и до труповете им се не допирайте.
9. От всички водни животни яжте всички ония, които имат перки и люспи;
10. а всички, които нямат перки и люспи, не яжте: това е нечисто за вас.
11. Всяка чиста птица яжте;
12. но от тях не бива да ядете тия: орел, гриф, морски орел,
13. пиляк, сокол, лешояд с породата им,
14. всякакъв гарван с породата му,
15. камилска птица, кукумявка, чайка, ястреб с породата му,
16. бухал, ибис, лебед,
17. пеликан, сип, рибар,
18. щъркел, гушавец с породата му, папуняк и прилеп.
19. Всички крилати влечуги нечисти са за вас, не (ги) яжте.
20. Всяка чиста птица яжте.
21. Не яжте никаква мърша; дай я на чужденеца, който е в твоите жилища, нека той я яде, или продай му (я), защото ти си народ свет за Господа, твоя Бог. Не вари яре в млякото на майка му.
22. Отделяй десетъка от цялото произведение на семената си, което ражда нивата (ти) всяка година
23. и яж пред Господа, твоя Бог, на мястото, което Той избере, за да пребъдва името Му там; (донасяй) десетъка от житото си, от виното си и дървеното си масло, и първородните от едрия си и дребен добитък, за да се научиш да се боиш от Господа, твоя Бог, през всички дни.
24. Ако ли пътят ти е дълъг, тъй че не можеш да носиш това, понеже далеч е от тебе мястото, което ще избере Господ, Бог твой, за да тури там името Си, и Господ, Бог твой, те е благословил,
25. то размени това на сребро и вземи среброто в ръка и иди на мястото, което ще избере Господ, Бог твой;
26. и с тия пари накупи всичко, що ти душа пожелае, волове, овци, вино, сикер и всичко, що ти душа пожелае; и яж там пред Господа, твоя Бог, и весели се ти и челядта ти.
27. И левитина, който е в жилищата ти, не изоставяй, понеже той няма част и дял с тебе.
28. В края на всеки три години отдели всички десетъци от произведенията си през последната година и тури (това) в жилищата си;
29. и нека левитинът дойде, понеже той няма част и дял с тебе, и пришълецът и сирачето и вдовицата, които са в твоите жилища, и нека ядат и се насищат, за да те благослови Господ, Бог твой, във всяка работа, която ще вършат ръцете ти.



Това мнение е било редактирано от Bender на 07-01-2018, 19:52
PM
Top
kapitancho
Публикувано на: 28-12-2017, 15:12
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 1116
Регистриран на: 26.02.05



QUOTE (Fly @ 28-12-2017, 15:02)
За това си има object mapper-и, за да не ти се пръсне главата от подобни мисли

Ок, т.е. ти "гласуваш" за варианта, при който всяка стойност си стои в оригиналния обект, нали така?

Т.е. това, че примерно стойността на is_active липсва, или че е наличен текстът само на единия език, а на останалите 5 липсва, не е драматично?

Също така, за въпросният обект е силно нежелателно да се вика update/persist icon_smile.gif


--------------------
®...¢↓"←—¬ªº±£™×÷⁄...©
PMEmail Poster
Top
Fly
Публикувано на: 28-12-2017, 15:17
Quote Post



Име: Димитър Костов
Група: Потребител
Ранг: Почетен член

Мнения: 3988
Регистриран на: 02.02.07



Как така лиспва, взимаме цял ред и го правим обект
PMEmail Poster
Top
kapitancho
Публикувано на: 28-12-2017, 15:52
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 1116
Регистриран на: 26.02.05



QUOTE (Fly @ 28-12-2017, 15:17)
Как така лиспва, взимаме цял ред и го правим обект

Ами липсва - пълният обект би трябвало да съдържа данните от Category + колекция с всички записи от CategoryText за съответната категория. Горната примерна заявка извлича само данните за категорията и за текстовете към ЕДИН от езиците. За да напълним обектите изцяло, трябва да се направят 2 заявки, което е излишно, при положение, че е поискано да се пратят данните само за 1 език.


--------------------
®...¢↓"←—¬ªº±£™×÷⁄...©
PMEmail Poster
Top
1 потребители преглеждат тази тема в момента (1 гости, 0 анонимни потребители)
Потребители, преглеждащи темата в момента:

Topic Options Страници: (3) [1] 2 3  Reply to this topicStart new topicStart Poll

 


Copyright © 2003-2018 | BG Development | All Rights Reserved
RSS 2.0