Add "Database Schema"

2026-06-29 16:35:19 +00:00
parent 0ade0caef0
commit 962752035c
+60
@@ -0,0 +1,60 @@
# Database Schema
## Table: `#__mokoog_tags`
Single table storing all OG tag data for articles, menu items, categories, and shop products. Supports multilingual content with per-language records.
### Columns
| Column | Type | Default | Description |
|---|---|---|---|
| `id` | INT(11) UNSIGNED | AUTO_INCREMENT | Primary key |
| `content_type` | VARCHAR(100) | `''` | Content context (e.g. `com_content`, `com_content.category`, `menu`, `com_mokoshop`) |
| `content_id` | INT(11) UNSIGNED | `0` | ID of the associated content item |
| `og_title` | VARCHAR(255) | `''` | Custom Open Graph title |
| `og_description` | TEXT | — | Custom Open Graph description |
| `og_image` | VARCHAR(512) | `''` | Path or URL to the OG image |
| `og_type` | VARCHAR(50) | `'article'` | OG type (`article`, `website`, `product`, `profile`, `book`, `music`, `video`) |
| `og_video` | VARCHAR(512) | `''` | Video URL (YouTube, Vimeo, or direct file) |
| `event_data` | TEXT | NULL | JSON — Event schema fields (dates, venue, tickets) |
| `recipe_data` | TEXT | NULL | JSON — Recipe schema fields (times, ingredients, nutrition) |
| `custom_schema` | TEXT | NULL | JSON — Custom JSON-LD schema (any schema.org type) |
| `seo_title` | VARCHAR(70) | `''` | Custom HTML `<title>` override |
| `meta_description` | VARCHAR(200) | `''` | Custom meta description |
| `robots` | VARCHAR(100) | `''` | Robots directives (noindex, nofollow, noarchive, etc.) |
| `canonical_url` | VARCHAR(512) | `''` | Custom canonical URL (http/https only) |
| `language` | CHAR(7) | `'*'` | Language code (`en-GB`, `*` for all) |
| `published` | TINYINT(1) | `1` | Publish state |
| `created` | DATETIME | `'0000-00-00 00:00:00'` | Record creation timestamp |
| `modified` | DATETIME | `'0000-00-00 00:00:00'` | Last modification timestamp |
### Indexes
| Index | Type | Columns | Purpose |
|---|---|---|---|
| `PRIMARY` | Primary Key | `id` | Row identifier |
| `idx_content_lang` | UNIQUE | `content_type`, `content_id`, `language` | One OG record per content item per language |
| `idx_published` | INDEX | `published` | Filter by publish state |
### Relationships
- **`content_type` + `content_id`** — polymorphic reference to any Joomla content item:
- `com_content``#__content.id` (articles)
- `com_content.category``#__categories.id` (categories)
- `menu``#__menu.id` (menu items)
- `com_mokoshop` → MokoSuiteShop product ID
- **`language`** — references Joomla's `#__languages.lang_code`; `*` matches all languages
### Language Fallback
Queries prefer a specific language match over the `*` wildcard. When loading OG data, the system plugin first looks for a record matching the current language, then falls back to `language = '*'`.
### JSON Columns
The `event_data`, `recipe_data`, and `custom_schema` columns store JSON objects. Values are validated as objects or arrays on save. Malformed data is guarded on render to prevent frontend errors.
### Engine
- **Engine:** InnoDB
- **Charset:** utf8mb4
- **Collation:** utf8mb4_unicode_ci