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