2

J'ai la table de base de données page avec les champs contenttype_id et content_id. Je veux créer un lien d'une page à un contenttype via contenttype_id et se référer à un réel contenu via content_id. Le problème est contenu dépendent du contenttype_id et sont modélisés différemment, donc le content_id fait référence à des tables différentes en fonction de la contenttype_id.Comment modéliser une base de données où une page peut avoir différents types de contenu?

CREATE TABLE "page" 
("id" "INT", 
"author" "VARCHAR(45)", 
"created" "DATE", 
"content_type" "INT", 
"content_id" "INT") 

CREATE TABLE "contenttype" 
("id" "INT", 
"name" "VARCHAR(45)") 

CREATE TABLE "content_redirect" 
("id" "INT", 
"url" "VARCHAR(45)") 

CREATE TABLE "content_script" 
("id" "INT", 
"url" "VARCHAR(45)", 
"params", "VARCHAR(45)") 

CREATE TABLE "content_text" 
("id" "INT", 
"text" "TEXT") 

CREATE TABLE "content_process" 
("id" "INT", 
"step1" "TEXT", 
"step2" "TEXT", 
"step3" "TEXT") 

CREATE TABLE "content_extprocess" 
("id" "INT", 
"system_id" "INT", 
"process_id" "INT") 

Comment faire? Ou est-ce déjà théoriquement faux?

+1

Pourquoi le contenu stocké dans des tables différentes? Besoin de plus d'informations, sinon je remplacerai content_id par le contenu réel car il se lit comme une relation un-à-un. –

+0

Les contenus possibles varient de "texte simple" à "script externe" à "processus composés de plusieurs étapes" de sorte que la structure de contenu nécessite des tables différentes – timpeti

+0

Je ne vois aucune raison d'avoir des tables différentes de votre explication. Pourquoi ne pouvons-nous pas avoir à la fois du texte simple et un lien vers le script dans le même tableau? –

Répondre

0

En supposant que le contenu de la page ait une structure de données différente et que le contenu ne puisse pas être stocké sous la forme d'un blob simple. Avoir une table de page avec page_id et type_type_de_type.

Vous pouvez avoir des contenus différents dans des tables différentes (une pour chaque type_type_de_table), chaque table de contenu fournissant une colonne de clé étrangère page_id pointant vers la table de pages. L'inconvénient serait que vous ne pouvez pas faire une jointure pour retourner le contenu pour tous les types de pages, mais vous devrez construire des requêtes SQL basées sur différentes valeurs du champ page.content_type_id.

1

Que diriez-vous de commencer?

alt text

EDIT:

create table Content (
     ContentID integer primary key 
    , ContentType char(2) 
    , ContentText text 
) engine=InnoDb; 

create table ScriptContent (
     ContentID integer primary key 
    , URL  varchar(45) 
    , Params varchar(45) 
) engine=InnoDb; 
alter table ScriptContent add constraint fk1_ScriptContent foreign key (ContentID) references Content (ContentID); 

create table ExternalProcess (
     ContentID integer primary key 
    , SystemID integer 
    , ProcessID integer 
) engine=InnoDb; 
alter table ExternalProcess add constraint fk1_ExternalProcess foreign key (ContentID) references Content (ContentID); 
+0

Comment traduisez-vous le symbole avec le X en SQL. À la fin, je devrai trouver un modèle utilisant un framework MVC comme CakePHP. – timpeti

+0

@timpeti - voir la modification –

+0

@timpeti. Vous n'avez pas SQL, vous avez MyNonSQL. Implémentez simplement les tables. Le modèle de Damir est correct. – PerformanceDBA