плоские файлы, очевидно, плохая идея, потому что вам нужно реализовать блокировку (БД уже делает это, и в этом коде меньше ошибок).
реляционная база данных - это больше искусство, чем наука: вы можете иметь
CREATE TABLE threads (
tid THREADID
, title THREADTITLE
, views COUNTER
, PRIMARY KEY (tid)
);
и это будет не более и не менее "правильным", чем
CREATE TABLE threads (
tid THREADID
, title THREADTITLE
, PRIMARY KEY (tid)
);
CREATE TABLE views (
tid THREADID
, views COUNTER
, PRIMARY KEY (tid)
, FOREIGN KEY (tid)
REFERENCES threads
);
так что это действительно зависит от вас.
Я бы сказал: сначала займитесь самой простой вещью, сделайте ее более сложной, если вы обнаружите, что это необходимо (например, по соображениям производительности). IOW: поместите атрибут views COUNTER
в threads
. если выясняется, что трафик снижает производительность (слишком большое количество обновлений атрибута threads.views
означает, что базы данных должны перетасовываться в противном случае неизменные данные в других атрибутах), вы всегда можете разделить таблицу на две части и заменить ее на представление что присоединяется к ним. Вуаля, неизменяемые (или редко меняющиеся) данные, отделенные от изменчивых данных, интерфейс остается прежним.
конечно, используйте PostgreSQL. приведенный выше код действителен в этих БД, просто добавьте их:
CREATE DOMAIN threadid
AS INT NOT NULL;
CREATE DOMAIN threadtitle
AS TEXT NOT NULL
CHECK (LENGTH(VALUE) > 0);
CREATE DOMAIN counter
AS INT NOT NULL
CHECK (VALUE > 0);
изменить , чтобы опровергнуть комментарий OMG Ponies: конечно, это безопасно.
UPDATE threads SET
views = views + 1
WHERE tid = X
либо успешно, либо выручает.
изменить 2 , чтобы добавить рассмотрение аспекта голосования
скажем, спецификация такова: пользователь может голосовать за поток вверх (+1) или вниз (-1), сумма его или ее голосов в данной теме не может превышать | 1 |, и история не имеет значения , iow пользователь может проголосовать за нить вверх, затем вниз, чтобы сбросить свой голос «без голосов», затем снова вниз, чтобы «проголосовал против» и т. д.
CREATE DOMAIN vote
AS INT NOT NULL
CHECK (VALUE BETWEEN -1 AND 1);
CREATE TABLE votes (
tid THREADID
, uid USERID
, vote VOTE
, PRIMARY KEY (tid, uid)
);
в MySQL, вы могли бы
INSERT INTO votes (
tid
, uid
, vote
) VALUES (
X
, Y
, Z -- +1 or -1
)
ON DUPLICATE KEY UPDATE
vote = vote + Z
увы, PostgreSQL не имеет (пока) такой встроенной функциональности, поэтому вам нужно будет использовать идиоматическую реализацию на уровне пользователя