Как правильно хранить отметки «прочитано» для фидов?

Здравствуйте!


Когда я узнал, что 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);

  • Вопрос задан
  • 3344 просмотра
Пригласить эксперта
Ответы на вопрос 2
@dndred
table post_user(userid, postid, isread)

select
post_content
from post_user
inner join posts
where userid = :userid
   and isread = False
Ответ написан
@artishok
кратко
можно обойтись без isread
Промахнулся кнопкой ответа
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы