Как сказал Ассаф, я не буду беспокоиться о хранении дублированных статей, если они приходят из разных каналов, по крайней мере сейчас. Сложность, которую это добавит, не принесет пользы тем небольшим килобайтам пространства, которые вы сэкономите.
Полагаю, если вы берете хэш sha1 содержимого, выполните SELECT id FROM articles WHERE hash = $hash
и, если что-то существует, просто укажите "article_content_id", который, если установить, указывает содержимое статьи в другой строке ... но что, если у вас два статьи:
id: 1
title: My First Post!
feed: Bobs site
content: Hi!
hash: abc
link: no
content_link_id:
id:2
title: My First Post!
feed: Planet Randompeople Aggregator
content:
hash: abc
content_link_id: 1
.. это работает нормально, и вы сэкономили 3 байта, не дублируя статью (очевидно, больше, если статья была длиннее)
.. но что происходит, когда Боб решает добавить рекламу в свой канал RSS, изменяя содержимое с Hi!
на Hi!<p><img src='...'></p>
- но Planet Randompeople удаляет все изображения. Затем, чтобы обновить элемент фида, вы должны проверить каждую строку, которая content_link_id
ссылается на статью, которую вы обновляете, проверить, имеет ли новый элемент тот же хэш, что и статьи, ссылающиеся на него - если он другой, у вас есть разорвать ссылку и скопировать старые данные в элемент ссылки, а затем скопировать новое содержимое в исходный элемент.
Возможно, есть более точные способы сделать это, но я хочу сказать, что это может стать очень сложным, и вы, вероятно, сэкономите всего несколько килобайт (при условии, что ядро базы данных не выполняет само сжатие) на очень ограниченном подмножестве сообщения ..
Кроме этого, наличие таблицы feeds
и items
кажется разумным, и именно так справлялись большинство других баз хранения RSS, которые я видел ..