Я на самом деле работал над похожим сайтом.Не для других сайтов, а для сайта, похожего на Facebook, для нишевого сообщества с новостными лентами из разных источников.В последние пару недель я очень серьезно размышлял над этим вопросом.
Одна проблема, возможно, не разрушающая игру, но все же проблема для меня, состоит в том, что поскольку ваша колонка foreign_key
не является буквально внешним ключомиз-за ссылки на несколько таблиц, поэтому он не может получить преимущества от таких вещей, как обеспечение ссылочной целостности.
Что я рассматриваю, так это создание таблицы GUID, которая служит источником идентификаторов для всех остальныхстолы и таблицы, специально предназначенные для новостной ленты.Это может быть определено как что-то вроде:
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"}