Здравствуйте!
Когда я узнал, что Google Reader закрывается, мне пришла в голову идея самому написать свой ридер на Java+GWT+Hibernate+Postgres+еще некоторое количество более мелких технологий (Horrorss для работы с RSS/Atom, GWT-Bootstrap для оформления приложения, gwt-p для работы с MVP, spring + spring data JPA для связывания всего этого дела вместе).
Если кому интересно, то вот проект на гитхабе:
github.com/asm0dey/jReader
И вот, на достаточно ранней стадии разработки — изменения сейчас вносить всё еще очень легко — я задумался над вопросом — а как, собственно, хранить пометки «прочитано» для фидов? Ведь пользователь может просмотривать сотни фидов в день. Ну и второй вопрос, с этим же связанный — а как показывать только непрочитанные фиды? Если делать запрос типа feed_item_id not in (перечесление всех просмотренных тут) — это же каким он бешенным получится, запрос-то такой… А если пользователей тысячи или десятки тысяч, то как вообще все это может работать.
Сейчас все это работает (должно работать) на постгресе, но если есть более правильные решения — с удовольствием выслушаю ваши идеи на этот счет.
И вот тут я подумал, что я наверное чего-то сильно не понимаю. У вас есть какие-то идеи о том, как должна работать система пометок «прочитано» для фидов?
PS: Если кто-то хочет поучаствовать в разработке — я буду очень, очень рад!
PPS: Основная идея моей реализации заключается в том, чтобы не хранить для каждого человека его уникальный набор фидов, а хранить только уникальные фиды, каждый из которых может принадлежать нескольким людям.
Дамп того, что есть сейчас:CREATE TABLE author (
id bigint NOT NULL,
consistencyversion smallint,
email character varying(255),
link character varying(255),
name character varying(255) NOT NULL
);
ALTER TABLE public.author OWNER TO postgres;
--
-- Name: feed; Type: TABLE; Schema: public; Owner: postgres; Tablespace:
--
CREATE TABLE feed (
id bigint NOT NULL,
consistencyversion smallint,
charset character varying(255),
imageurl character varying(255),
lastupdatedate timestamp without time zone,
title character varying(255),
url character varying(255) NOT NULL
);
ALTER TABLE public.feed OWNER TO postgres;
--
-- Name: feedgroup; Type: TABLE; Schema: public; Owner: postgres; Tablespace:
--
CREATE TABLE feedgroup (
id bigint NOT NULL,
consistencyversion smallint,
name character varying(255) NOT NULL
);
ALTER TABLE public.feedgroup OWNER TO postgres;
--
-- Name: feedgroup_feed; Type: TABLE; Schema: public; Owner: postgres; Tablespace:
--
CREATE TABLE feedgroup_feed (
feedgroup_id bigint NOT NULL,
feeds_id bigint NOT NULL
);
ALTER TABLE public.feedgroup_feed OWNER TO postgres;
--
-- Name: feeditem; Type: TABLE; Schema: public; Owner: postgres; Tablespace:
--
CREATE TABLE feeditem (
id bigint NOT NULL,
consistencyversion smallint,
author character varying(255),
createdon timestamp without time zone,
text character varying(32000),
title character varying(2000),
url character varying(255),
feed_id bigint NOT NULL
);
ALTER TABLE public.feeditem OWNER TO postgres;
--
-- Name: human; Type: TABLE; Schema: public; Owner: postgres; Tablespace:
--
CREATE TABLE human (
id bigint NOT NULL,
consistencyversion smallint,
email character varying(255) NOT NULL,
isactive boolean NOT NULL,
loginattempts integer NOT NULL,
passwordhash character varying(255) NOT NULL
);
ALTER TABLE public.human OWNER TO postgres;
--
-- Name: human_feedgroup; Type: TABLE; Schema: public; Owner: postgres; Tablespace:
--
CREATE TABLE human_feedgroup (
human_id bigint NOT NULL,
subscribedfeeds_id bigint NOT NULL
);
ALTER TABLE public.human_feedgroup OWNER TO postgres;
--
-- Name: author_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres; Tablespace:
--
ALTER TABLE ONLY author
ADD CONSTRAINT author_pkey PRIMARY KEY (id);
--
-- Name: feed_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres; Tablespace:
--
ALTER TABLE ONLY feed
ADD CONSTRAINT feed_pkey PRIMARY KEY (id);
--
-- Name: feedgroup_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres; Tablespace:
--
ALTER TABLE ONLY feedgroup
ADD CONSTRAINT feedgroup_pkey PRIMARY KEY (id);
--
-- Name: feeditem_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres; Tablespace:
--
ALTER TABLE ONLY feeditem
ADD CONSTRAINT feeditem_pkey PRIMARY KEY (id);
--
-- Name: human_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres; Tablespace:
--
ALTER TABLE ONLY human
ADD CONSTRAINT human_pkey PRIMARY KEY (id);
--
-- Name: uk_add752afd96c715f; Type: CONSTRAINT; Schema: public; Owner: postgres; Tablespace:
--
ALTER TABLE ONLY human_feedgroup
ADD CONSTRAINT uk_add752afd96c715f UNIQUE (subscribedfeeds_id);
--
-- Name: uk_feed_1; Type: CONSTRAINT; Schema: public; Owner: postgres; Tablespace:
--
ALTER TABLE ONLY feed
ADD CONSTRAINT uk_feed_1 UNIQUE (url);
--
-- Name: uk_human_1; Type: CONSTRAINT; Schema: public; Owner: postgres; Tablespace:
--
ALTER TABLE ONLY human
ADD CONSTRAINT uk_human_1 UNIQUE (email);
--
-- Name: authot_email_index; Type: INDEX; Schema: public; Owner: postgres; Tablespace:
--
CREATE INDEX authot_email_index ON author USING btree (email);
--
-- Name: item_date_index; Type: INDEX; Schema: public; Owner: postgres; Tablespace:
--
CREATE INDEX item_date_index ON feeditem USING btree (createdon);
--
-- Name: item_title_index; Type: INDEX; Schema: public; Owner: postgres; Tablespace:
--
CREATE INDEX item_title_index ON feeditem USING btree (title);
--
-- Name: item_url; Type: INDEX; Schema: public; Owner: postgres; Tablespace:
--
CREATE INDEX item_url ON feeditem USING btree (url);
--
-- Name: fkadd752afc01fb76; Type: FK CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY human_feedgroup
ADD CONSTRAINT fkadd752afc01fb76 FOREIGN KEY (subscribedfeeds_id) REFERENCES feedgroup(id);
--
-- Name: fkadd752affedf9830; Type: FK CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY human_feedgroup
ADD CONSTRAINT fkadd752affedf9830 FOREIGN KEY (human_id) REFERENCES human(id);
--
-- Name: fkd1f0f3dc6b7b6890; Type: FK CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY feedgroup_feed
ADD CONSTRAINT fkd1f0f3dc6b7b6890 FOREIGN KEY (feedgroup_id) REFERENCES feedgroup(id);
--
-- Name: fkd1f0f3dcd280a84d; Type: FK CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY feedgroup_feed
ADD CONSTRAINT fkd1f0f3dcd280a84d FOREIGN KEY (feeds_id) REFERENCES feed(id);
--
-- Name: fkf86539f1a3b648a4; Type: FK CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY feeditem
ADD CONSTRAINT fkf86539f1a3b648a4 FOREIGN KEY (feed_id) REFERENCES feed(id);