我正在开发一个应用程序,该应用程序通常从大量网站收集信息并将其保存到mysql数据库,并为每个站点提供一个表。我们的想法是创建一种可自定义的新闻源。
我希望能够请求任意数量的新闻项目并过滤掉某些网站。举个例子:
显示最新的100个项目,但不包括Twitter和GitHub中的项目。
似乎处理此问题的最佳方法是创建一个只有外键和网站名称的表。
master_table(id,website,date,foreign_key)
我可以从这个表中查询我需要的外来ID。
我是否正在谈论这个可怕的错误?
答案 0 :(得分:1)
我实际上在一个类似的网站上工作。不适用于其他网站,而是一个类似Facebook的网站,适用于来自不同来源的新闻源的利基社区。在过去的几周里,我一直在非常重视这个问题。
一个问题,可能不是游戏破坏,但对我来说仍然是一个问题,因为你的foreign_key
列由于引用多个表而不是字面上的外键,所以它无法从事物中获益例如参照完整性执法。
我正在考虑制作一个GUID表,作为所有其他表的ID源,并有一个专门用于新闻源的表。它可能被定义为:
CREATE TABLE sources (
id INTEGER AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(20),
url VARCHAR(50) );
INSERT INTO sources (name, url) VALUES ('Stack Overflow', 'http://stackoverflow.com');
INSERT INTO sources (name, url) VALUES ('Reddit', 'http://www.reddit.com');
INSERT INTO sources (name, url) VALUES ('Github', 'http://github.com');
INSERT INTO sources (name, url) VALUES ('Twitter', 'http://twitter.com');
/* And so on... */
CREATE TABLE newsfeed (
guid INTEGER PRIMARY KEY, -- Note: NOT auto_increment!
source_id INTEGER NOT NULL,
timestamp DATETIME NOT NULL,
text VARCHAR(256),
ref_id INTEGER NOT NULL,
FOREIGN KEY (source_id) references sources (id) );
您仍然可以在自己的表中存储有关站点发布的信息,但现在您只是引用一个新闻源表,以了解页面上实际显示的内容,如果有人想要,则ref_id是指向各个源表的指针深入了解信息。它仍然不理想,因为ref_id仍然不是真正的外键,但它可以说好一点。
你甚至可能想做类似这样的事情而不是ref_id:
data TEXT,
对于任何给定条目,该列的内容是特定于源的数据有效负载。例如,对于Github帖子,它可以包含一个JSON字符串,例如:
{"commit_message":"Updated global variable namespace.",
"author":"King Skippus","repository":"Ibuware"}
答案 1 :(得分:1)
您可能会觉得有用的一些想法:
如您所说,您可以将所有常用属性放在一个表中:
master_table(id, website, date, foreign_key,url)
然后创建另一个表:
details_tables(id, master_id, property_name, property_value, property_type)
,用于检索特定于每个站点的数据。我相信它会比在json中存储所有东西更灵活。如果您希望这些表中有许多记录,请考虑使用分区。
您还可以保留现有的表格结构,但添加视图:
SELECT 'Stack Overflow' as site_name, id, url, date
FROM stackoverflow_table
UNION
SELECT 'Reddit' as site_name, id, url, date
FROM reddit_table
...etc
答案 2 :(得分:-1)
每个站点的表都是问题。随着越来越多的网站上线,您将获得太多链接。
让相关的DBA /架构师修复您的数据模型,您的链接问题将会消失。