jon*_*sca 6 mysql database-design varchar
我正在尝试为一个存储和操作 Twitter 推文的程序设计一个数据库。
我正在使用代码将推文分成单词、用户名和主题标签,所以
I'm meeting @President over coffee to talk about my new job #cabinet #woot
Run Code Online (Sandbox Code Playgroud)
将分解为{meeting, over, coffee, talk, about, new, job}(去掉 2 个字母以下的单词并去除标点符号后)、{president}、 和{cabinet,woot}。
由于我在这方面缺乏经验,我希望能够根据需要增加列中的行数,但我的直觉告诉我这将是一场噩梦。我考虑过的另一种可能性是选择一个任意数字,比如 10 列来存储单词,5 列用于存储用户名等,但这会有点粗糙,因为我不确定会有多少,并且我不得不扔掉可能是有价值的信息。
就目前而言,我有 3 varchars 足够长的时间,其中包括“喝咖啡谈新工作”、“总统”和“内阁呼声”。因此,每当我需要获取特定推文的信息时,我都会检索该行并拆分字符串。
这是“正确”的路线吗?我是否错过了一种可以让我的生活更轻松的明显方法?(我在网上找到了一些关于 using 的信息array,但我使用的是 MySQL,它似乎不支持该数据类型。
经过提问者的一些评论后编辑!:
更好的设计理念: 
(如果你不熟悉这些图,那就是七个表,外键链接如图[这三个_Link表都有两个引用数据表的外键]。看起来我可能把事情复杂化了,但相信我, “tokenise一次,并存储在数据库中”是如此不是“每次检索时间tokenise数据”更有效。)
示例数据,使用一条简单的推文(暂时忽略用户,但这是相同的概念):“测试推文!#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
Run Code Online (Sandbox Code Playgroud)
这使您可以轻松获取推文中链接的所有用户:
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>
Run Code Online (Sandbox Code Playgroud)
(根据主题标签和单词更改表格名称)
或者,稍微复杂一点,获取所有提及特定主题标签的推文的前 10 个词:
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
Run Code Online (Sandbox Code Playgroud)
(我使用过 ANSI SQL 语法,我不能 100% 确定 MySQL 是否支持所有 ANSI SQL - 但它应该足够接近。)