一个表是否应该引用每个其他表

时间:2011-06-02 03:58:08

标签: mysql database database-design

我正在开发一个应用程序,该应用程序通常从大量网站收集信息并将其保存到mysql数据库,并为每个站点提供一个表。我们的想法是创建一种可自定义的新闻源。

  • stackoverflow_table(id,url,title,date)
  • reddit_table(id,title,url,author,date)
  • github_commit_table(ID, commit_message,作者,存储库, 分支,日期)
  • twitter_table(id,tweet,author,url,date)
  • 等...

我希望能够请求任意数量的新闻项目并过滤掉某些网站。举个例子:

显示最新的100个项目,但不包括Twitter和GitHub中的项目。

似乎处理此问题的最佳方法是创建一个只有外键和网站名称的表。

master_table(id,website,date,foreign_key)

我可以从这个表中查询我需要的外来ID。

我是否正在谈论这个可怕的错误?

3 个答案:

答案 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 /架构师修复您的数据模型,您的链接问题将会消失。