Votre table pourrait être quelque chose comme
CREATE TABLE ArticleText (
INTEGER artId,
INTEGER wordNum,
INTEGER wordId,
PRIMARY KEY (artId, wordNum),
FOREIGN KEY (artId) REFERENCES Articles,
FOREIGN KEY (wordId) REFERENCES Words
)
Bien sûr, cela peut être très coûteux espace, ou lent, etc, mais vous aurez besoin des mesures pour déterminer que (comme si dépend beaucoup de votre DB moteur). BTW, j'espère qu'il est clair que la table Articles est simplement une table avec des métadonnées sur des articles entrés par artId, et les mots table une table de tous les mots dans chaque article keyId (essayant d'économiser de l'espace en identifiant des mots déjà connus quand un article est entré, si c'est faisable ...). Un mot spécial doit être le marqueur «fin de paragraphe», facilement identifiable en tant que tel et distinct de tout mot réel.
Si vous structurez vos données de cette manière, vous obtenez une grande flexibilité dans la récupération par page, et la longueur de la page peut être modifiée en un instant, même requête par requête si vous le souhaitez. Pour obtenir une page:
SELECT wordText
FROM Articles
JOIN ArticleText USING (artID)
JOIN Words USING (wordID)
WHERE wordNum BETWEEN (@pagenum-1)*@pagelength AND @pagenum * @pagelength + @extras
AND Articles.artID = @articleid
paramètres @pagenum
, @pagelength
, @extras
, @articleid
doivent être insérés dans la requête préparée au moment de la requête (utilisation quelle que soit la syntaxe de votre base de données et le langage comme, par exemple :extras
ou paramètres numérotés ou autre) . Donc, nous obtenons @extras
mots au-delà de la fin de page attendue, puis du côté client, nous vérifions ces mots supplémentaires pour nous assurer que l'un d'entre eux est le marqueur de paragraphe final - sinon nous ferons une autre requête (avec différents BETWEEN
valeurs) pour obtenir encore plus. Loin d'être idéal, mais compte tenu de tous les problèmes que vous avez mis en évidence, il vaut la peine d'en tenir compte. Si vous pouvez compter sur la longueur de la page, par ex. un multiple de 100, vous pouvez adopter une légère variation de ceci sur la base de blocs de 100 mots (et pas de tableau Words
, juste du texte stocké directement par ligne).
et s'il y a quelques centaines d'articles longs et les re-fractionnant peut-être besoin d'arrêter le site pour maintenance ... et s'il y a un bug dans le script de re-split, alors le contenu peut être contaminé? –
Eh bien, s'il y a un bogue dans un code qui fonctionne avec des données, le contenu peut être endommagé. Vous pouvez éviter la nécessité d'arrêter le site en démarrant et en validant une transaction autour de l'enregistrement de chaque article. Mais arrêter un site de maintanance de temps en temps est une chose courante. – artemb
Vous n'auriez pas besoin d'arrêter le site !!, vous pourriez reconstruire l'article pendant qu'il est en ligne. Je suggère également d'ajouter un article de table (avec article_id comme identité/autoincrement/..., et le corps du texte), c'est le texte original qui est divisé en morceaux. Dans l'algorithme, je voudrais définir un déclencheur pour mettre à jour le texte des morceaux en ligne ... ajouter de nouveaux morceaux qui n'étaient pas là, et supprimer les morceaux inutiles. –