تخطَّ إلى المحتوى الرئيسي

Developer Page Specifications

Data Model

17 tables — Article core, Lang i18n, Industry + IndustryLang + ArticleIndustry, Category, Topic, Author, Images, ArticleConnectedEntity, Analytics, Seo, Versions.

مكتمل

14 جدول لـ Editorial. الأساسي (Article + Lang)، Taxonomy (Category + Topic مع رفقاء Lang + join ArticleTopic)، الناس (Author + Lang)، الإعلام (ArticleImage)، Cross-module (ArticleRelated للروابط اليدوية، EcosystemEntityLinks مشترك)، التشغيلي (Analytics، Seo). كل حقل bilingual يَستخدم جدول رفيق *Lang.

الجدول 1 · EditorialArticle (أساسي)

الهوية
Id (uuid PK)، Slug (varchar(120) unique). CanonicalArticleId (FK → self، nullable) لربط زوج-الترجمة.
النوع + الموضوع
Type (enum: news|analysis|commentary|interview|profile|guide، مطلوب). Topic (varchar(40)، مطلوب، قيمة واحدة). Sector + Country (varchar، nullable، مُسوّاة من الإشارات للفلترة السريعة).
مفاتيح أجنبية
CategoryId (FK → EditorialCategory، مطلوب)، AuthorId (FK → EditorialAuthor، مطلوب)، FeaturedImageId (FK → EditorialArticleImage، nullable).
مصفوفات entities المذكورة
MentionedFounderIds (uuid[])، MentionedStartupIds، MentionedEventIds، MentionedOpportunityIds. كلها اختيارية. تُغذّي reverse-lookups cross-module + شريط connected-signals.
علامات تحريرية
IsActive (bool، بوّابة soft-delete)، IsFeatured (bool، يَقود spotlight)، IsEditorPick (bool، يَقود فرز "editor-picks")، IsMostRead (bool، override يدوي للاختيارات التحريرية)، IsSponsored (bool، يَقود إفصاح الراعي)، IsPractical (bool، يَكتم شريط Files cross-module)، IsTranslated (bool، true حين هذه ترجمة لمقالة أخرى).
دورة الحياة
Status (enum: draft|in-review|scheduled|published|archived، مطلوب). PublishDate، UpdatedDate، ScheduledFor (timestamptz). ViewCount (int، مُسوّاة من EditorialArticleAnalytics).
meta القراءة
ReadingTimeMinutes (int، محتسبة من عدد كلمات الجسم وقت الحفظ)، WordCount (int)، OriginalLanguage (varchar(2)، 'en' أو 'ar').
التدقيق
CreatedAt، UpdatedAt، CreatedByUserId، LastEditedByUserId.

الجداول 2-14

  • EditorialArticleLang (PK مُرَكَّب ArticleId + Lang): Title، Subtitle?، Dek، Excerpt، BodyHtml (مُعَقَّم)، MetaTitle?، MetaDescription?.
  • EditorialCategory (Id، Slug، IconKey، DisplayOrder، IsActive). رفيق EditorialCategoryLang: Name + Description.
  • EditorialTopic (Id، Slug، RelatedCategoryId?). رفيق EditorialTopicLang: Name + Description.
  • EditorialArticleTopic (join: ArticleId ↔ TopicId، DisplayOrder).
  • EditorialAuthor (Id، Slug، AvatarUrl، LinkedInUrl، TwitterUrl، PersonalSiteUrl، Email، IsActive). رفيق EditorialAuthorLang: DisplayName + Role + Bio.
  • EditorialArticleImage (Id، ArticleId، Url، Alt (bilingual)، Caption (bilingual)، Credit، AspectRatio، DisplayOrder). DisplayOrder=0 هو الغلاف المميَّز.
  • EditorialArticleRelated (related يدوي: ArticleId ↔ RelatedArticleId، DisplayOrder). مُنَسَّق-من-المحرّر.
  • EditorialArticleAnalytics (ArticleId PK، ViewCount، AvgReadingTimeMs، ScrollDepthAvgPct، BounceRate، LastViewedAt). تُحَدَّث تدريجياً بـ analytics ingestion.
  • EditorialArticleSeo (ArticleId PK، CanonicalUrl، OgImage?، SchemaType: 'Article'|'NewsArticle'|'BlogPosting'). حين null، مُشتقّ من الافتراضيات.
  • EditorialArticleVersion (جدول لقطات لتاريخ التحرير، نافذة استرداد 90-يوم).
  • EcosystemEntityLinks (مشترك على نطاق-المنصّة، انظر §13.1.3 — يَدعم entityType='editorial').
  • EditorialSubscription (Email، PreferredLang، InterestCategories[]، ConsentPlatform، ConsentPartners، Source: 'listing'|'category'|'topic'|'article'، ArticleIdContext?، CreatedAt).