Если одна таблица ссылается на другую таблицу - PullRequest
1 голос
/ 02 июня 2011

Я работаю над приложением, которое регулярно собирает информацию с большого количества веб-сайтов и сохраняет ее в базе данных mysql с таблицей для каждого сайта. Идея заключается в создании своего рода настраиваемой ленты новостей.

  • stackoverflow_table (идентификатор, URL, заголовок, дата)
  • reddit_table (идентификатор, заголовок, URL, автор, дата)
  • github_commit_table (идентификатор, commit_message, автор, хранилище, филиал, дата)
  • twitter_table (идентификатор, твит, автор, URL, дата)
  • и т.д ...

Мне нужна возможность запрашивать любое количество новостей и отфильтровывать определенные сайты. Как пример:

Показать 100 новых предметов, но исключить их из Twitter и GitHub.

Кажется, что лучший способ справиться с этим - создать таблицу, в которой есть только внешние ключи и имена веб-сайтов.

master_table (id, веб-сайт, дата, ключ_приключения)

и я могу просто запросить нужные мне иностранные идентификаторы из этой таблицы.

Я поступаю так ужасно неправильно?

Ответы [ 3 ]

1 голос
/ 02 июня 2011

Я на самом деле работал над похожим сайтом.Не для других сайтов, а для сайта, похожего на 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"}
1 голос
/ 02 июня 2011

Некоторые идеи, которые вы можете найти полезными:
Как вы сказали, вы можете поместить все общие свойства в одну таблицу: 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<br> FROM stackoverflow_table UNION<br> SELECT 'Reddit' as site_name, id, url, date<br> FROM reddit_table ...etc

0 голосов
/ 02 июня 2011

Таблица для каждого сайта является проблемой. По мере появления новых сайтов в сети у вас будет слишком много ссылок.

Привлеките DBA / Architect для исправления вашей модели данных, и проблема с ссылками исчезнет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...