web-dev-qa-db-fra.com

Rangées avec un nombre variable de colonnes?

J'essaie de concevoir une base de données pour un programme qui stocke et manipulant des tweets hors twitter.

J'utilise le code pour fragmenter un tweet en mots, noms d'utilisateur et hashtags, donc

I'm meeting @President over coffee to talk about my new job #cabinet #woot

tomberait dans {meeting, over, coffee, talk, about, new, job} (se débarrasser des mots sous 2 lettres et après dénudage de ponctuation), {president}, et {cabinet,woot}.

Avec mon manque d'expérience dans ce domaine, j'aimerais simplement être capable de développer le nombre de lignes dans une colonne si nécessaire, mais mon intuition me dit que ce serait un cauchemar. Une autre possibilité que j'ai envisagée est juste de choisir un nombre arbitraire comme 10 colonnes pour stocker des mots, 5 pour les noms d'utilisateur, etc., mais cela le ferait un peu, comme je ne le sais pas avec certitude combien il y aura, et Je devrais jeter ce qui peut être des informations précieuses.

Comme il se trouve maintenant, j'ai 3 varchars de longueur suffisante qui détiennent "la réunion sur la discussion sur le café sur le nouvel emploi", "Président" et "Cabinet Woot". Donc, chaque fois que je dois saisir les informations pour un tweet particulier, je récupère la rangée et rompt les cordes.

Est-ce la route "correcte"? Est-ce que je manque une manière évidente qui facilitera ma vie? (J'avais trouvé quelque chose en ligne sur l'utilisation de array, mais j'utilise MySQL et que cela ne semble pas supporter ce type de données.

6
jonsca

Edité après quelques commentaires de la question pose!:

Meilleure idée pour votre conception: new sample schema

(Si vous n'êtes pas familière avec ces diagrammes, c'est sept tables, avec des liens clés étrangers comme illustrés [les trois _Link Tables ont tous deux clés étrangères faisant référence aux tables de données]. On dirait probablement que je suis surcharge des choses, mais je me fais confiance, "Tokenise une fois et stocker dans la base de données" est SO beaucoup plus efficace que "des données de tokenise chaque fois que vous la récupérez".).

Exemples de données, à l'aide d'un simple tweet (ignorant les utilisateurs pour l'instant, c'est le même concept, cependant): "Test Tweet! #Howdoesthiswork #Newbie"

      Tweet
TweetID   WordCount
   1         2

Tweet_Word_Link
TweetID   WordID
   1         1
   1         2

      Word
WordID    Word
   1      test
   2      Tweet

Tweet_Hashtag_Link
TweetID  HashtagID
   1         1
   1         2

      Hashtag
HashtagID  Hashtag
    1      #howdoesthiswork
    2      #newbie

Cela vous permet d'obtenir facilement tous les utilisateurs liés dans un tweet:

SELECT U.UserName
FROM  User U
        INNER JOIN
      Tweet_User_Link TUL ON U.UserID = TUL.UserID
        INNER JOIN
      Tweet T ON TUL.TweetID = T.TweetID
WHERE T.TweetID = <your ID here>

(Modifiez les noms de table selon que nécessaire pour les hashtags et les mots)

Ou légèrement plus compliqué, obtenez les 10 meilleurs mots pour tous les tweets mentionnant un hashtag spécifique:

SELECT TOP 10 W.Word, COUNT(*) AS WordCount
FROM  Word W
        INNER JOIN
      Tweet_Word_Link TWL ON TWL.WordID = W.WordID
        INNER JOIN
      Tweet T ON TWL.TweetID = T.TweetID
        INNER JOIN
      Tweet_Hashtag_Link THL ON THL.TweetID = T.TweetID
        INNER JOIN
      Hashtag H ON H.HashtagID = THL.HashtagID
WHERE H.Hashtag = <your hashtag here>
GROUP By W.Word

(J'ai utilisé une syntaxe ANSI SQL, je ne suis pas sûr à 100% si MySQL prend en charge tout ANSI SQL - mais il devrait être suffisamment proche.)

9
Simon Righarts