3

例 : 私は 2 つのテーブルを持っています
- カテゴリ
- 投稿

このようなカテゴリで投稿番号を保持するのは良い方法ですか

カテゴリー

 id |  title   | posts
----+----------+--------
 1  | golf     |  50
----+----------+-------
 2  | soccer   |  90
----+----------+-------

投稿

 id |  title   | category_id
----+----------+--------------
 1  | news 1   |  1
----+----------+--------------
 2  | news 2   |  2
----+----------+--------------
 3  | news 3   |  1
----+----------+--------------

または、このようなクエリで select count() を使用します

SELECT c.id,
       c.title,
       count(p.id)
FROM `categories` c
INNER JOIN `posts` p ON c.id=p.category_id
GROUP BY c.id

しかし、問題は、カテゴリを変更したときにカテゴリテーブルにカウントを保持するときです。カテゴリテーブルの投稿フィールドも更新する必要があります。小さなプロジェクトでは問題ありませんが、大きなプロジェクトでは、データベースのパフォーマンスが懸念されるため、カウントを処理する良い方法は何ですか

すべての回答に感謝します

4

5 に答える 5

2

My personal preference would be not to keep duplicated data in any table, until it has been proven necessary. If you are averse to writing JOIN queries, you could define a view that contains the query and you can then forget about it.

I have found in the past that proper indexes usually mean there isn't too much of a performance problem with this.

If you find it necessary to keep a count summary your categories table (for performance or other reasons), consider creating INSERT, UPDATE and DELETE triggers on your posts table so that updates can be done by the database rather than relying on the application programmers to remember what has to be done.

于 2012-12-18T09:01:37.723 に答える
1

Dr. Dan's comment is correct. It is indeed a good idea to store the count of posts in categories, but remember that if you do that "You must also have triggers to increment and decrement the count when new post is inserted or existing post is deleted" to maintain the integrity.

于 2012-12-18T09:01:56.353 に答える
1

This, in general depends on your use-case.

From the pure view, of course, you should not introduce redundancy, so your proposed query would be the way to go. However, you might hit some performance problems.

A second approach would be to have a trigger on the posts-table which maintains the posts-counter in categories, but this might also impact performance if there are lots of inserts/deletes in the posts-table.

Another approach would be to have some dirty-flag, which if set causes an update to the categories-table.

So how to proceed? First try out the pure and clean thing, if that hits performance issues, analyze your usage-profile and act depending on that.

于 2012-12-18T09:08:47.683 に答える
1

JOIN2つのテーブル間とGROUP BY投稿に使用する必要があると思います

于 2012-12-18T09:40:00.833 に答える
0

ご指摘のとおり、カウントを個別に保存すると、メンテナンスの問題が発生することがわかっています。

理想的には、カウントを動的に決定する必要があります。適切なインデックスが配置されていれば、これはほとんどのシステムにとって大きな問題にはなりません。

ただし、事前に計算されたカウントが非常に理にかなっている場合があります。時系列サイクルでデータを更新するシステムを考えてみましょう。リフレッシュ アクティビティ以外に、システムに情報を挿入するものはありません。この種のシステムは、事前に計算されたカウントに最適です。

あなたの問題を具体的に見ると、そのオプションはないようです。これはかなり「ブログ」のように見え、結果として、カウントが常に変化する可能性があるものです。

私だったら、ダイナミック カウント ルートから始めて、ダイナミックが問題になった場合に事前に計算された値までトレードします。

于 2012-12-18T09:04:08.823 に答える