19 KiB
پیشنهاد معماری جدید: Backend-owned Plants + AI farm_data Sync
خلاصه تصمیم
تصمیم جدید این است که مالک اصلی دادههای گیاه در سیستم، Backend باشد و اپ plants در Backend بهصورت کامل مسئول نگهداری catalog گیاهها شود.
در این معماری:
- اپ
Backend/plantsمنبع اصلیPlant Catalogخواهد بود - اپ
Backend/farm_hubرابطهی فارم با گیاهها را نگه میدارد - اپ
Ai/farm_dataدادههای مورد نیاز AI را از Backend دریافت میکند - پس از هر تغییر در Backend، دادههای مرتبط در
Ai/farm_dataبهروزرسانی میشوند - هرجایی در AI که به اطلاعات گیاه نیاز دارد، از دادههای
farm_dataاستفاده میکند
هدف اصلی
این تغییر برای حل چند مسئله انجام میشود:
- متمرکز شدن catalog گیاهها در Backend
- حذف پراکندگی ownership دادههای گیاه
- واضح شدن source of truth
- سادهتر شدن استفادهی ماژولهای AI از اطلاعات گیاه
- فراهم شدن یک read-model مشخص در
Ai/farm_data
تصمیم domain-level
1) Backend مالک اصلی دادهی گیاه است
در این معماری، اطلاعات پایهی گیاه باید در Backend نگهداری شود:
- نام گیاه
- مشخصات کاتالوگ
- ویژگیهای رشد
- نور
- آب
- خاک
- دما
- فصل کاشت
- زمان برداشت
- spacing
- fertilizer
- و هر دادهی canonical دیگر
2) AI مصرفکنندهی دادهی گیاه است
در این معماری، AI دیگر owner دادههای گیاه نیست، بلکه از Backend این اطلاعات را دریافت میکند.
3) Ai/farm_data لایهی دادهای مورد استفادهی AI میشود
در AI، دادهی گیاه مستقیماً از مدل canonical مستقل خوانده نمیشود، بلکه از دادههایی استفاده میشود که در Ai/farm_data ذخیره یا sync شدهاند.
ساختار پیشنهادی Backend
اپ plants
اپ Backend/plants باید به اپ canonical برای catalog گیاهها تبدیل شود.
مسئولیتها
- نگهداری لیست همهی گیاهها
- نگهداری اطلاعات catalog هر گیاه
- ارائهی API برای خواندن catalog گیاهها
- ارائهی API برای دریافت جزئیات یک گیاه
- در صورت نیاز، ارائهی endpointهای تغییرات برای sync با AI
دادههای این app
نمونه دادههایی که بهتر است در plants باشند:
idnameslugicondescriptionlightwateringsoiltemperaturegrowth_stage_defaultsplanting_seasonharvest_timespacingfertilizerhealth_profileirrigation_profilegrowth_profileis_activeupdated_at
اپ farm_hub
در Backend/farm_hub باید رابطهی فارم با گیاه نگهداری شود.
پیشنهاد رابطه
در گام اول، چیزی که گفتی منطقی است:
- یک رابطهی
ManyToManyبینFarmHubوPlant
مثلاً در سطح مفهومی:
class FarmHub(models.Model):
plants = models.ManyToManyField("plants.Plant", related_name="farms", blank=True)
این ساختار برای شروع خوب است اگر فقط بخواهی بدانی:
- هر فارم چه گیاههایی دارد
نکته تکمیلی مهم
اگر بعداً برای رابطهی فارم و گیاه metadata خواستی، ManyToMany ساده کافی نیست.
مثلاً اگر این دادهها لازم شوند:
- تاریخ کاشت
- وضعیت فعلی رشد
- نوع کشت در آن فارم
- تنظیمات اختصاصی آبیاری
- health state
- مقدار هدف تولید
بهتر است بعداً رابطه به مدل واسط تبدیل شود:
class FarmPlant(models.Model):
farm = models.ForeignKey(FarmHub, on_delete=models.CASCADE)
plant = models.ForeignKey("plants.Plant", on_delete=models.CASCADE)
planted_at = models.DateField(null=True, blank=True)
stage = models.CharField(max_length=64, blank=True)
نتیجه
- برای فاز اول:
ManyToManyساده قابل قبول است - برای فاز matureتر:
through modelبهتر است
ساختار پیشنهادی AI
نقش Ai/farm_data
در این تصمیم جدید، Ai/farm_data تبدیل به لایهای میشود که دادههای گیاه و دادههای فارم-گیاه را برای مصرف ماژولهای AI نگه میدارد.
یعنی:
- Backend source of truth است
Ai/farm_dataread/update replica برای use caseهای AI است
وظایف farm_data
- دریافت دادهی گیاه از Backend
- دریافت relationهای فارم و گیاه از Backend
- ذخیرهی دادهی مورد نیاز برای AI
- بهروزرسانی داده بعد از هر تغییر
- ارائهی data access ساده برای سایر appهای AI
جریان داده پیشنهادی
مرحله 1: تغییر در Backend
هر تغییری که در این بخشها رخ میدهد:
- ایجاد گیاه جدید
- ویرایش catalog گیاه
- حذف یا غیرفعالسازی گیاه
- تغییر گیاههای مرتبط با یک فارم
باید باعث شود Ai/farm_data نیز بهروزرسانی شود.
مرحله 2: sync به AI
بعد از تغییر، Backend از طریق API یا مکانیزم sync، داده را به Ai/farm_data میرساند.
مرحله 3: مصرف در AI
هر app در AI که به دادهی گیاه نیاز دارد، بهجای dependency مستقیم روی مدلهای قدیمی یا منابع پراکنده، از farm_data میخواند.
نکته مهم درباره apps.py
اگرچه در پیام قبلی بحث Ai/farm_data/apps.py مطرح بود، در این تصمیم جدید بهتر است منطق sync اصلی در apps.py قرار نگیرد.
apps.py برای چه مناسب است؟
- app registration
- signal registration
- import سبک startup
apps.py برای چه مناسب نیست؟
- orchestration سنگین sync
- HTTP fetch logic
- retry logic
- reconciliation logic
- business update flow
پیشنهاد بهتر
منطق sync بهتر است در این فایلها قرار بگیرد:
Ai/farm_data/services.pyAi/farm_data/tasks.pyAi/farm_data/clients/backend.py
و apps.py فقط wiring را انجام دهد.
دو نوع دادهای که باید تفکیک شوند
برای اینکه این معماری بعداً تمیز بماند، بهتر است از همین ابتدا دو نوع داده را از هم جدا ببینی.
1) Plant Catalog
دادههای عمومی و canonical هر گیاه:
- نام
- مشخصات رشد
- پروفایل آبیاری
- نیازهای محیطی
این دادهها متعلق به Backend/plants هستند.
2) Farm Plant Assignment / Context
دادههایی که مشخص میکنند:
- یک فارم چه گیاهی دارد
- چه گیاهی برای آن فارم فعال است
- چه context یا تنظیمی روی آن اعمال شده
این دادهها از relation بین فارم و گیاه میآیند و در Backend تعریف میشوند، اما برای مصرف AI در farm_data sync میشوند.
چه appهایی در AI باید update شوند؟
در این معماری جدید، همه appهای AI لزوماً نیاز به تغییر مستقیم ندارند؛ فقط appهایی که الان مستقیم یا غیرمستقیم به دادهی گیاه یا SensorData.plants وابستهاند باید update شوند.
1) Ai/farm_data
این app مهمترین app برای تغییر است و باید به هستهی integration جدید تبدیل شود.
فایلها و بخشهایی که باید update شوند
Ai/farm_data/models.pyAi/farm_data/serializers.pyAi/farm_data/services.pyAi/farm_data/views.pyAi/farm_data/urls.pyAi/farm_data/apps.pyAi/farm_data/management/commands/seed_farm_data.pyAi/farm_data/tests/
تغییرات مورد نیاز
- حذف وابستگی مستقیم
ManyToManyبهplant.Plantدر صورت جایگزینی با replica data - تعریف ساختار جدید برای نگهداری
plant catalog snapshotیاfarm plant snapshot - افزودن service client برای خواندن data از Backend
- افزودن endpoint یا task برای sync داده از Backend
- تغییر serializerها تا payload جدید گیاه را برگردانند
- اصلاح تستها بر اساس source جدید داده
نکته مهم
الان در Ai/farm_data/models.py فیلد plants به plant.Plant وصل است. این نقطه یکی از اصلیترین جاهایی است که باید بازطراحی شود، چون در معماری جدید AI نباید برای catalog گیاه به مدل canonical داخلی تکیه کند.
2) Ai/rag
این app از مهمترین مصرفکنندههای اطلاعات گیاه است و باید update شود تا بهجای مدلهای قبلی، از farm_data بخواند.
فایلها و بخشهایی که باید update شوند
Ai/rag/user_data.pyAi/rag/services/irrigation.pyAi/rag/services/fertilization.pyAi/rag/services/water_need_prediction.pyAi/rag/services/pest_disease.pyAi/rag/services/yield_harvest.pyAi/rag/tests/test_recommendation_services.py- هر فایل دیگری که مستقیم
PlantیاSensorData.plantsرا میخواند
تغییرات مورد نیاز
- حذف import مستقیم از
plant.models - استفاده از facade یا service داخل
farm_dataبرای دریافت plant context - جایگزینی readهای مستقیم از مدل گیاه با read model جدید
- اصلاح تستها بر اساس structure جدید داده
نکته مهم
در حال حاضر Ai/rag/user_data.py مستقیم به Plant وابستگی دارد. این وابستگی باید حذف شود و همه چیز از farm_data خوانده شود.
3) Ai/irrigation
این app احتمالاً از دادهی گیاه برای recommendation یا indicator استفاده میکند و باید با read model جدید سازگار شود.
فایلها و بخشهایی که باید update شوند
Ai/irrigation/indicators.pyAi/irrigation/views.py- تستهای
irrigation
تغییرات مورد نیاز
- اگر منطق آبیاری به plant profile وابسته است، profile باید از
farm_dataخوانده شود - حذف هر dependency متنی یا مستقیم به جدول
Plant - هماهنگی responseها با data contract جدید
4) Ai/soile
این app مستقیماً SensorData را میخواند و در queryها plants را prefetch میکند؛ بنابراین باید update شود.
فایلها و بخشهایی که باید update شوند
Ai/soile/services.pyAi/soile/test_soil_moisture_heatmap_api.py
تغییرات مورد نیاز
- بازنویسی queryهایی که
prefetch_related("plants")دارند - استفاده از plant data جدیدی که در
farm_dataذخیره میشود - اصلاح منطقهایی که فرض میکنند
plantsیک relation مستقیم ORM به مدلPlantاست
5) Ai/weather
این app بیشتر weather-centric است، ولی برخی flowها از SensorData و در مواردی از context فارم/گیاه برای پیشبینی نیاز آبی استفاده میکنند.
فایلها و بخشهایی که باید update شوند
Ai/weather/water_need_prediction.pyAi/weather/farm_weather.py- تستهای مرتبط با farm weather
تغییرات مورد نیاز
- اگر plant context برای water need استفاده میشود، منبع آن باید
farm_dataباشد - اگر serializer یا service فرض میکند relation قبلی
plantsبرقرار است، باید اصلاح شود
6) Ai/location_data
این app بیشتر location-centric است و وابستگی مستقیم شدیدی به گیاه ندارد، اما چون با SensorData کار میکند باید از سازگاری model جدید مطمئن شویم.
فایلها و بخشهایی که باید update شوند
Ai/location_data/ndvi.pyAi/location_data/views.pyدر صورت استفاده از farm context- تستهای location مرتبط با farm
تغییرات مورد نیاز
- بیشتر در حد compatibility check با ساختار جدید
farm_data - اگر plant-aware response وجود دارد، باید با source جدید هماهنگ شود
7) Ai/farm_alerts
اگر alertها به نوع گیاه، stage، یا context گیاه متکی باشند، این app هم باید update شود.
فایلها و بخشهایی که باید بررسی/آپدیت شوند
Ai/farm_alerts/services.pyAi/farm_alerts/alerts_tracker.pyAi/farm_alerts/views.py
تغییرات مورد نیاز
- هرجا alert rule به plant info وابسته است، plant info باید از
farm_dataخوانده شود - اگر فعلاً وابستگی مستقیم ندارد، فقط compatibility review کافی است
8) Ai/economy
این app ممکن است در بعضی سناریوها به نوع گیاه برای تحلیل اقتصادی وابسته شود.
فایلها و بخشهایی که باید بررسی شوند
Ai/economy/services.pyAi/economy/views.py- تستهای economy
تغییرات مورد نیاز
- اگر نوع گیاه یا catalog گیاه در محاسبات اقتصادی استفاده میشود، باید از
farm_dataخوانده شود - اگر فعلاً استفادهای ندارد، تنها review کافی است
appهایی که احتمالاً بیشترین تغییر را دارند
اگر بخواهیم اولویتبندی کنیم، بیشترین تغییر در AI بهترتیب در این appها خواهد بود:
Ai/farm_dataAi/ragAi/soileAi/irrigationAi/weather
و این appها بیشتر نیاز به review و compatibility check دارند:
Ai/location_dataAi/farm_alertsAi/economy
الگوی پیشنهادی برای جلوگیری از پخش شدن وابستگیها
برای اینکه تغییرات در AI کنترلپذیر بماند، بهتر است appهای دیگر مستقیماً model جدید farm_data را تکهتکه query نزنند.
پیشنهاد
یک لایهی access مرکزی در farm_data تعریف شود، مثلاً:
Ai/farm_data/services.py- یا
Ai/farm_data/context.py
و appهای دیگر فقط از همین interface استفاده کنند.
مثال از مسئولیت این facade
- گرفتن plant catalog برای یک farm
- گرفتن primary plant یا active plants
- گرفتن irrigation profile گیاه
- گرفتن growth/health context گیاه
این کار باعث میشود اگر بعداً schema داخلی farm_data عوض شد، فقط یک لایه update شود.
تغییرات مستندی که باید در AI انجام شوند
علاوه بر کد، این بخشهای مستنداتی هم باید update شوند:
Ai/API_REFERENCE_FA.mdAi/APPS_URLS_AUDIT.mdAi/API_RELIABILITY_AUDIT_FA.md- هر doc مرتبط با
Plant API - هر doc مرتبط با
farm_datapayload
دلیل
چون در وضعیت جدید:
Plant APIدیگر نباید بهعنوان canonical داخل AI معرفی شودfarm_dataباید بهعنوان plant consumer/read model معرفی شود- endpointها و schemaهای response احتمالاً تغییر میکنند
پیشنهاد فازبندی update اپهای AI
فاز 1: هستهی data layer
- update
Ai/farm_data - تعریف schema جدید data
- تعریف sync service با Backend
فاز 2: مصرفکنندههای اصلی
- update
Ai/rag - update
Ai/soile - update
Ai/irrigation - update
Ai/weather
فاز 3: مصرفکنندههای ثانویه
- review/update
Ai/location_data - review/update
Ai/farm_alerts - review/update
Ai/economy
فاز 4: پاکسازی نهایی
- حذف dependency مستقیم به
plant.models - حذف endpointهای قدیمی یا deprecated در AI
- اصلاح تستها و docs
صورتبندی نهایی این تغییر
نسخهی دقیقتر و کاملتر این تصمیم به این صورت است:
- یک app کامل
plantsدر Backend نگهدارندهی catalog همهی گیاهها باشد. - در
Backend/farm_hubرابطهیManyToManyبینFarmHubوPlantتعریف شود. - بعد از هر تغییر در catalog گیاه یا رابطهی فارم-گیاه، دادهها به
Ai/farm_datasync شوند. Ai/farm_dataبه منبع مصرفی همهی ماژولهای AI برای اطلاعات گیاه تبدیل شود.- در AI هرجا اطلاعات گیاه، catalog گیاه، یا نوع گیاه لازم است، از
farm_dataخوانده شود، نه از مدلهای پراکنده یا منبع دیگری. - appهای AI که الان به
PlantیاSensorData.plantsوابستهاند باید مرحلهبهمرحله به این مدل جدید مهاجرت کنند.
نتیجه یکخطی
این تصمیم از نظر معماری قابل دفاع و قابل توسعه است، به شرطی که Backend/plants source of truth بماند، farm_hub رابطهی فارم-گیاه را نگه دارد، Ai/farm_data لایهی sync/read برای AI باشد، و تمام appهای وابسته در AI بهصورت کنترلشده از dependency مستقیم به Plant جدا شوند.