المعرّفات
لكل سجل id. تشير إليه السجلات الأخرى وقاعدة بياناتك وروابط URL الخاصة بك، لذا يجب أن يكون المعرّف صحيحًا مرة واحدة ثم لا يتغير أبدًا. تعرض هذه الصفحة القواعد، وسبب وجود كل منها، وما يحدث حين يغيّر القانون الشيء الذي يسمّيه المعرّف.
القواعد
- لكل سجل حقل
id، وهو فريد داخل مجموعة بياناته. والكود العام (فهرس، ذاكرة مؤقتة، نموذج) يعامل كل مجموعات البيانات بالطريقة نفسها. - الرمز الرسمي يغلب، إذا كان يغطي كل السجلات. حيث تمنح السلطات رمزًا لكل سجل في مجموعة بيانات، يكون المعرّف هو ذلك الرمز: البلديات تستخدم رمز REFNIS الخاص بـStatbel (
44021لـGent). أما الرمز الذي لا يغطي إلا بعض السجلات فيُحفظ حقلًا بدلًا من ذلك: للمحاكم رموز ECLI فيecli، وللـjustitiehuizen الفلمنكية رقم OVO فيovo(انظر السبب). - وإلا، فـASCII بصيغة kebab-case وأحرف صغيرة:
^[a-z0-9]+(-[a-z0-9]+)*$، يبنيهscripts/id.ts: تُحذف علامات التشكيل، وكل ما ليس حرفًا أو رقمًا يصبح شرطة واحدة.Merelbeke-Melle→merelbeke-melle،Braine-l'Alleud→braine-l-alleud،Liège→liege. - من الاسم الرسمي باللغة المحلية: الهولندية في Vlaanderen (فلاندرز)، والفرنسية في Wallonie (والونيا)، والألمانية حول Eupen. Brussel ثنائية اللغة رسميًا وتحتاج إلى اختيار ثابت واحد: الهولندية.
- الرقم لاحقة: الأماكن التي فيها عدة كانتونات تحصل على
gent-1…gent-5. - المحاكم
type+ المكان:justice-of-the-peace-gent-1،court-of-appeal-liege. يأخذ الـvredegerecht / justice de paix معرّف كانتونه. والمحكمتان من النوع نفسه في Brussel، واحدة لكل لغة، تضيفان-nlأو-fr(police-court-brussel-fr). ويضيف القسم أو المقر مكانه الخاص إلى معرّف محكمته (enterprise-court-gent-brugge). تُبقي البادئة المعرّفات فريدة حين يكون في Gent vredegerecht وondernemingsrechtbank وarbeidsrechtbank، وهي بالضبطtypeالسجل، فلا تحتاج أبدًا إلى مفردات ثانية. - السجون والـjustitiehuizen / maisons de justice هي أسماؤها باللغة المحلية، دون أدوات التعريف:
gevangenis-gent،prison-lantin،justitiehuis-gent،maison-justice-arlon. أسماؤها تقول أصلًا ما هي، ومؤسستان في مدينة واحدة (السجن المركزي والسجن المساعد في Leuven) تختلفان بالاسم. - الروابط حقول، لا سلاسل نصية مشتقة أبدًا. للـvredegerecht / justice de paix حقل
canton؛ والكانتون يسرد{ municipality }؛ وللدائرة القضائية (arrondissement) حقلjudicialArea. يحمل كل منها معرّف السجل الذي يشير إليه، ويُسمّى الحقل باسم مجموعة البيانات التي يشير إليها.
تفرض الاختبارات (test/ids.test.ts) كل هذا، وكذلك مخططات JSON Schema التي تسرد المعرّفات الصالحة، فيفشل التحقق عند وجود رابط معلّق.
المعرّفات
| مجموعة البيانات | أمثلة | القاعدة |
|---|---|---|
| المناطق القضائية | antwerpen، brussel، gent، liege، mons | الاسم المحلي |
| الدوائر القضائية | oost-vlaanderen، brabant-wallon، eupen | الاسم المحلي |
| الكانتونات | gent-1، merelbeke-melle، wavre-1، oudergem، eupen-sankt-vith-1 | الاسم المحلي + رقم |
| حدود الكانتونات | gent-1: حد واحد لكل كانتون، بمعرّف الكانتون، وcanton هو الرابط | معرّف الكانتون |
| البلديات | 44021، 21004 | رمز REFNIS |
| المقاطعات | 10000، 40000 | رمز REFNIS |
| الأقاليم | 02000، 03000، 04000 | رمز REFNIS |
| الرموز البريدية | 9000-44021، 1040-21005 | الرمز البريدي + رمز REFNIS |
| المحاكم | justice-of-the-peace-gent-1، enterprise-court-gent-brugge، police-court-brussel-fr، police-court-eupen-sankt-vith | النوع + المكان |
| السجون | gevangenis-gent، prison-lantin، detentiehuis-kortrijk | الاسم المحلي |
| Justitiehuizen | justitiehuis-gent، maison-justice-arlon | الاسم المحلي |
| أسعار الفائدة | legal، commercial | مفاتيح ثابتة |
لماذا هذه الاختيارات
لماذا kebab-case؟ ينتهي المطاف بالمعرّفات في روابط URL (/cantons/gent-1)، وأسماء الملفات، وأصناف CSS، ومفاتيح قواعد البيانات، وسطور السجلات. الأحرف الصغيرة تتجنب التصادم في الأنظمة التي لا تميّز حالة الأحرف (أنظمة ملفات macOS وWindows، وكثير من ترتيبات collation في قواعد البيانات): Gent1 وgent1 سيكونان معرّفين في البيانات وملفًا واحدًا على القرص. والشرطات تُبقي حدود الكلمات مقروءة دون أحرف كبيرة، ومجموعة الأحرف لا تحتاج إلى تهريب (escaping) في أي مكان.
لماذا معرّفات مقروءة بدلًا من أرقام أو UUID؟ مجموعة البيانات المرجعية يقرؤها البشر: justice-of-the-peace-gent-1 في صف من قاعدة بيانات أو في رسالة خطأ يخبرك بما هو. والمعرّفات مستقرة كما لو كانت أرقامًا، لأنها لا تتغير إلا حين يغيّر القانون الشيء الذي تسمّيه (انظر أدناه)، وعندها يكون المعرّف الجديد هو النتيجة الصحيحة.
لماذا اللغة المحلية لا الإنجليزية؟ توجد أسماء إنجليزية لعدد قليل من الأماكن (Ghent وAntwerp وLiege) ولا توجد للكانتونات الـ162، فالمعرّفات الإنجليزية كانت ستعني قاعدتين. والاسم المحلي هو أيضًا ما تستخدمه المؤسسة نفسها، وهو الوارد في النصوص الرسمية.
لماذا الرموز الرسمية؟ REFNIS هو ما تستخدمه Statbel والأقاليم وكل مجموعة بيانات بلجيكية تقريبًا. وحين يكون الرمز هو المعرّف، لا يحتاج ربط أي منها بالكانتونات والمحاكم إلى جدول تحويل.
لماذا رمزان للرمز البريدي؟ الرمز البريدي وحده لا يسمّي سجلًا: 1040 ينتمي إلى Brussel وإلى Etterbeek، وكل زوج سجل مستقل بفترة سريانه الخاصة. وزوج الرموز الرسمية، 1040-21005، فريد ويبقى كما هو إلى أن يغيّر جدول Statbel الزوج، وهذا بالضبط حين يكون السجل الجديد صحيحًا. والبلدية حقل أيضًا (municipality)، كما تطلب القاعدة 8: المعرّف مفتاح، لا شيء يُقسَّم.
لماذا type في معرّفات المحاكم؟ في المكان الواحد عدة محاكم، وأنواع المحاكم ستزداد (محاكم الـpolitierechtbank / tribunal de police، والـarbeidsrechtbank / tribunal du travail، والـrechtbank van eerste aanleg / tribunal de première instance…). حقول المحكمة نفسها تقول ما هي؛ والمعرّف لا يحتاج إلا إلى أن يكون فريدًا ومميَّزًا، والنوع يحقق الأمرين.
لماذا لا الرموز الرسمية للمحاكم؟ للمحاكم رمزان رسميان، ولا يغطي أي منهما كل المحاكم. رموز ECLI (HBGNT لـhof van beroep / cour d'appel في Gent) موجودة لكل محكمة ولكل لغة، لا لكل قسم، ولا يظهر أي منها في الأحكام المنشورة لمحاكم الـvredegerecht / justice de paix. وأرقام المؤسسات (KBO) تعود إلى FOD Justitie / SPF Justice (الوزارة الاتحادية للعدل)؛ ووحدات منشآتها تتبع المباني لا المحاكم، وتتغير حين تنتقل محكمة. والقاعدة التي تصح لكل سجل أفضل من قاعدتين، لذا رموز ECLI حقل (ecli)، والمعرّف يتبع القاعدة 6.
لماذا الروابط الصريحة؟ كان المخطط القديم يبني معرّف المحكمة بوصل Vredegerecht بمعرّف الكانتون. هذا يخبّئ علاقة في صيغة نصية، وهي تنكسر لحظة تخدم محكمة واحدة كانتونين أو يتغير اسم. أما الحقل canton فيتحقق منه المخطط والاختبارات، ويمكن تتبعه في الاتجاهين.
في TypeScript
لكل مجموعة بيانات نوع معرّف مولَّد (CantonId، CourtId، MunicipalityId، ProvinceId، RegionId، ArrondissementId، JudicialAreaId، PrisonId، HouseOfJusticeId، PostalCodeId)، يُعاد توليده من البيانات بـpnpm build:ids:
import { getCanton, type CantonId } from 'belgica'
getCanton('gent-1') // Canton: المعرّف المعروف يجد سجله دائمًا
getCanton(userInput) // Canton | undefined: أي سلسلة أخرى قد لا تجده
const id: CantonId = 'gent1' // خطأ compile: ليس معرّف كانتوناستخدم أنواع المعرّفات للقيم التي تخزّنها، حتى يُكتشف الخطأ الإملائي أو المعرّف المحذوف حين تقوم بالترقية.
حين يغيّر القانون معرّفًا
الكانتونات والبلديات تتغير فعلًا: اندمجت بلديات في 2019 و2025، والقوانين تعيد رسم الكانتونات. تحمل السجلات فترة سريان (validFrom، validTo)، فيضيف التغيير تاريخًا بدلًا من أن يمحوه:
- يبقى السجل القديم، مع
validTo؛ ويحصل الجديد على معرّف جديد وvalidFrom. لا يُعاد استخدام معرّف لشيء مختلف أبدًا، فالمعرّف المخزَّن منذ سنوات لا يزال يجد ما كان يعنيه. - دون يوم، تجيب دوال البحث عن اليوم الحالي: البحث بالمعرّف يعطي النسخة السارية اليوم (والنسخة الأخيرة لسجل انتهى)، والقوائم مثل
getCantonsForMunicipalityلا تعطي إلا ما يسري اليوم. ومع{ on }يجيب كلاهما عن ذلك اليوم. - يسرد سجل التغييرات (changelog) كل معرّف جديد والمعرّفات التي يحل محلها.
تغيير الاسم وحده، كتصحيح إملائي، لا يغيّر المعرّف. والتاريخ قبل 1 يناير 2025 ليس في البيانات بعد (#27): البحث عن يوم سابق يرمي RangeError بدلًا من الإجابة بخريطة اليوم.
المعرّفات معتمة
المعرّف مفتاح، لا صيغة. لا يمكن تقسيم court-of-first-instance-luxembourg-marche-en-famenne رجوعًا إلى النوع والمكان والقسم، لأن النوع والمكان ولاحقة اللغة تستخدم كلها الشرطة نفسها. لا تحلّل المعرّفات: كل جزء من المعرّف حقل أيضًا (type، court، canton، arrondissement)، والحقول هي ما تتحقق منه المخططات والاختبارات.
الاستقرار
المعرّفات جزء من الواجهة العامة (API). إضافة سجلات إصدار minor، وتصحيح قيمة patch، وحذف معرّف أو إعادة تسميته إصدار major. يستبدل الإصدار 0.3.0 المعرّفات السابقة بصيغة PascalCase (VredegerechtGent1، EastFlanders) بهذا المخطط قبل أن يكون للحزمة أي مستخدم؛ ويسرد سجل التغييرات التحويل.
هذا الوعد يُتحقَّق منه، لا يُقطع فحسب. يسرد ids.lock.json كل معرّف نشرته الحزمة، لكل مجموعة بيانات؛ ويضيف pnpm generate المعرّفات الجديدة إليه ولا يحذف واحدًا أبدًا، ويفشل test/ids.test.ts حين يغيب معرّف مقفل عن البيانات. وهكذا لا يستطيع مستخرِج (scraper) يقرأ صفحة تغيّر عنوانها، أو قائمة كانتونات أُعيد توليدها، أو تعديل يدوي، أن يُسقط معرّفًا أو يعيد تسميته دون أن يُلاحَظ: يفشل الـpull request الأسبوعي للبيانات، ويربط شخصٌ الاسمَ الجديد بالمعرّف الموجود في المحلّل، أو يُنهي السجل بـvalidTo. وإخراج معرّف من القفل فعل متعمَّد، لإصدار major، مع المعرّف وبديله في سجل التغييرات.