Flexibele CMS DB structuur(SQLite)
Ik ben bezig met mijn eigen CMS maken met SQLite als database.
Het is voor mezelf, dus ik wil dat het flexibel, snel en veilig is.
Wat ik wil doen is dat ik de users en pages alleen de hoog nodige info meegeef, en dat ik dan nog een appare tabel heb voor extra velden.
Voor pages zou dat dus zijn een id, en een titel, de rest word er door een soort one to many of many to many relatie aan gehangen.
Bijvoorbeeld een veld(content bijvoorbeeld) kan bij meerdere pages horen, en pages kunnen meerdere velden hebben.
Waar zou ik de content van content dan moeten zetten?
Ik wil het wel een beetje standaard houden, zodat elke soort page die een content heeft het zelfde content veld gebruikt, alleen met een andere content.
Hoe pak ik zo iets aan?
Zelfde geld natuurlijk voor users, die hebben alleen een id, name en password, en daar hang je dan dingen zoals email en rechten aan.
Het voordeel van zo'n page systeem is dat je ze voor van alles kan gebruiken(muziek: artiest en rating er aan hangen bijvoorbeeld), beetje zoals expression engine, maar dan niet helemaal.
wat ik me zo'n beetje voorstel is dit:
pages:
page_id INTEGER PRIMARY KEY
page_type INTEGER
title TEXT
page_meta:
id INTEGER PRIMARY KEY
page_id INTEGER
page_type INTEGER
name TEXT
value BLOB/TEXT
page_type:
page_type INTEGER PRIMARY KEY
page_type_name TEXT
user:
user_id INTEGER PRIMARY KEY
name TEXT
password TEXT
user_meta:
id INTEGER PRIMARY KEY
user_id INTEGER
key TEXT
value BLOB/TEXT
settings:
id INTEGER PRIMARY KEY
key TEXT
value BLOB/TEXT
Dan kan je met JOIN wel iets aan elkaar bakken toch?
Wat me alleen niet zint is dat nu elke page zijn eigen veld heeft, ik zou een soort van templates willen hebben, dat je niet voor elke pagina zijn velden hoeft in te stellen, en dat je ook bijvoorbeeld alle pages van een zelfde type kan ophalen, en dan er zeker van zijn dat ze alle velden hebben die jij verwacht dat ze hebben.
Ik heb eigenlijk nie zo heel veel verstand van SQL hoor, dus als ik in een heel verkeerde richting zit te denken...
Groenten
Pepijn
Ik snap dat ik lastige vragen stel... Waar is PgFrank als je hem nodig hebt! haha
Je mag ook gewoon zeggen "Beste Pepijn, ga eens rustig een SQL tutorial doorlezen, want dit is basis kennis." hoor.
Het is trouwens voor mijn eind opdracht van school, beetje rare school, dus dat ga ik verder niet helemaal uitleggen. Het is trouwens niet zo dat ik dit moet doen en dat ik dus maar hulp ga zoeken omdat ik lui ben, ik heb deze opdracht zelf gekozen, en wil hem gewoon zo goed mogelijk doen.
Ik hoop dat dit je bedoeling was. Als ik helemaal verkeerd zit te denken meld het dan even maar dit is wat ik er van heb begrepen.
Het probleem is dat ik niet de inhoud aan meerdere pagina's wil kunnen koppelen, maar de SOORT inhoud. Zou je dan nog een tabel moeten maken met de content die je allemaal koppelt aan een veld? Of wil ik gewoon iets dat niet kan?
Eigenlijk wil ik in de SQL kunnen zeggen dat elke page met het type X ook de velden moet hebben van type X, anders komt er later narigheid, bijvoorbeeld een page die per ongeluk geen content heeft... Of kan ik in SQLite ook van die prepared dingen maken, zodat ik alleen maar hoef te zeggen create(<type>) ofzo...
Dan zul je volgens mij de inhoud van de pagina's opslaan met het type inhoud dat je invoegd. Als pagina's dan maar 1 soort inhoud kunnen bevatten geef je dat op in de tabel met pagina's. Wil je echter meerdere soorten inhoud op 1 pagina dan moet je volgens mij een koppeltabel maken die de soort inhoud verbind met een bepaalde pagina.
iets als:
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
INSERT INTO pages
(page_type, titel)
VALUES (<pagina type>, <pagina titel>);
INSERT INTO page_meta
(page_type, name, value)
VALUES (SELECT (page_type, name, value) FROM page_meta WHERE page_type = <pagina type> && value = NULL);
(page_type, titel)
VALUES (<pagina type>, <pagina titel>);
INSERT INTO page_meta
(page_type, name, value)
VALUES (SELECT (page_type, name, value) FROM page_meta WHERE page_type = <pagina type> && value = NULL);
Hmmm, ik kom er niet echt uit, zit ik een beetje in de goede richting of slaat dit nergens op?
Ik heb er iig een hoop gok werk bij zitten en ik doe nu nog niks met de page_id in page_meta.
Nu returnt die select natuurlijk alle lege velden van een type, insert hij ze dan ook allemaal, of werkt het niet zo simpel?
En hoe krijg ik die page_id er bij? met nog een sub query of ene join ofzo?
Ik merk dat mijn SQL echt een beetje verroest is... Ik ben de laatste tijd meer met Wordpress bezig, dus zelf SQL typen is er dan niet bij. Het lastige is dat als ik nu SQL tutorials ga lezen ik de helft al weet, de andere helft weer vergeet, en wat er dan over blijft...
Simpeler, maar minder gestroomlijnd zou zijn om eerst een select te doen, dan met php voor elk veld een nieuwe query uitvoeren...
Edit:
Dit is mijn pages db tot nu toe, om even wat me te testen... als ik nu dit uitvoer krijg ik alle velden van een pagina terug:
Hoe krijg ik het zo ver dat al die gegevens op een row komen?
Ik heb trouwens uitgevonden dat het handig zou kunnen zijn om SELECT INTO te gebruiken om mijn templates te kopiëren. Ik hou jullie op de hoogte over mijn eigen vorderingen, maar dat wil niet zeggen dat ik niet een beetje hulp kan gebruiken hoor. ;)
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
BEGIN TRANSACTION;
CREATE TABLE page_meta (meta_id INTEGER PRIMARY KEY, name TEXT, page_id INTEGER, page_type INTEGER, value BLOB);
INSERT INTO page_meta VALUES(1,'body',1,1,NULL);
INSERT INTO page_meta VALUES(2,'date',1,1,NULL);
INSERT INTO page_meta VALUES(3,'excerpt',1,1,NULL);
INSERT INTO page_meta VALUES(4,'body',2,2,NULL);
INSERT INTO page_meta VALUES(5,'body',3,1,'Dit is mijn eerste blog post dan... alleen in de database dan he! nog geen cms of andere toffe dingen.');
INSERT INTO page_meta VALUES(6,'date',3,1,1234467137);
INSERT INTO page_meta VALUES(7,'excerpt',3,1,'Dit is mijn eer[more...]');
CREATE TABLE page_type (page_type INTEGER PRIMARY KEY, page_type_name TEXT);
INSERT INTO page_type VALUES(1,'blog post');
INSERT INTO page_type VALUES(2,'page');
CREATE TABLE pages (id INTEGER PRIMARY KEY, page_type INTEGER, title TEXT);
INSERT INTO pages VALUES(1,1,'blog post');
INSERT INTO pages VALUES(2,2,'page');
INSERT INTO pages VALUES(3,1,'Hello world');
COMMIT;
CREATE TABLE page_meta (meta_id INTEGER PRIMARY KEY, name TEXT, page_id INTEGER, page_type INTEGER, value BLOB);
INSERT INTO page_meta VALUES(1,'body',1,1,NULL);
INSERT INTO page_meta VALUES(2,'date',1,1,NULL);
INSERT INTO page_meta VALUES(3,'excerpt',1,1,NULL);
INSERT INTO page_meta VALUES(4,'body',2,2,NULL);
INSERT INTO page_meta VALUES(5,'body',3,1,'Dit is mijn eerste blog post dan... alleen in de database dan he! nog geen cms of andere toffe dingen.');
INSERT INTO page_meta VALUES(6,'date',3,1,1234467137);
INSERT INTO page_meta VALUES(7,'excerpt',3,1,'Dit is mijn eer[more...]');
CREATE TABLE page_type (page_type INTEGER PRIMARY KEY, page_type_name TEXT);
INSERT INTO page_type VALUES(1,'blog post');
INSERT INTO page_type VALUES(2,'page');
CREATE TABLE pages (id INTEGER PRIMARY KEY, page_type INTEGER, title TEXT);
INSERT INTO pages VALUES(1,1,'blog post');
INSERT INTO pages VALUES(2,2,'page');
INSERT INTO pages VALUES(3,1,'Hello world');
COMMIT;
Dit is mijn pages db tot nu toe, om even wat me te testen... als ik nu dit uitvoer krijg ik alle velden van een pagina terug:
Code (php)
1
SELECT id, title, page_type_name, name, value FROM pages JOIN page_meta ON pages.id = page_meta.page_id JOIN page_type ON pages.page_type = page_type.page_type WHERE id = 3
Hoe krijg ik het zo ver dat al die gegevens op een row komen?
Ik heb trouwens uitgevonden dat het handig zou kunnen zijn om SELECT INTO te gebruiken om mijn templates te kopiëren. Ik hou jullie op de hoogte over mijn eigen vorderingen, maar dat wil niet zeggen dat ik niet een beetje hulp kan gebruiken hoor. ;)
Edit:
SELECT INTO gaat toch niet werken, dat maakt een hele nieuwe tabel, ik wil een soort row copy met een paar eigen waardes.
SELECT INTO gaat toch niet werken, dat maakt een hele nieuwe tabel, ik wil een soort row copy met een paar eigen waardes.
Edit:
Tot zo ver voor vandaag...
Nog een paar problemen:
Die 2 losse inserts werken(bijna), maar samen niet...
MAX(pages.rowid) werkt niet, maar ik moet iets vinden om de page_id van de eerste insert te pakken te krijgen.
"test" moet de waarde zijn die er per veld in komt, niet allemaal "test", dat kan niet zo natuurlijk, hoe wel?
Code (php)
1
2
3
4
2
3
4
INSERT INTO pages (page_type, title) VALUES (1, "About");
INSERT INTO page_meta
(page_id, page_type, name, value)
SELECT MAX(pages.rowid), page_type, name, "test" FROM page_meta WHERE page_type = 1 AND value IS NULL;
INSERT INTO page_meta
(page_id, page_type, name, value)
SELECT MAX(pages.rowid), page_type, name, "test" FROM page_meta WHERE page_type = 1 AND value IS NULL;
Tot zo ver voor vandaag...
Nog een paar problemen:
Die 2 losse inserts werken(bijna), maar samen niet...
MAX(pages.rowid) werkt niet, maar ik moet iets vinden om de page_id van de eerste insert te pakken te krijgen.
"test" moet de waarde zijn die er per veld in komt, niet allemaal "test", dat kan niet zo natuurlijk, hoe wel?
Gewijzigd op 01/01/1970 01:00:00 door pepijn de vos
Ik kom niet meer verder... hoe pak ik dit aan?
"t is al weken geleden dat ik hier iets heb gepost... Ik ga het nog een keer proberen, dan geef ik het op. Zelf kom ik geen stap verder.