Hem tablolarda bilgi olması daha iyi olurdu?

5 Cevap php

Ben bir tablo var GAMES başka PLAYERS. Şu anda her bir "oyun" players_in_game için bir sütun vardır ama PLAYERS tabloda hiçbir şey reciprocating var. Bu sütun, bir dizi (Virgül oyuncunun ID # s ayrılmış listesi) Ben muhtemelen her oyuncunun kayıt ayrıca bir üyesi olan oyunların bir listesini içerir için daha iyi olacağını düşünüyorum çünkü. Öte yandan, iki ayrı tablo içindeki bilgileri çoğaltma aslında daha DB çağrı gerektirebilir.

Perspektif için, bir oyun (genellikle 4-6 norm) daha sonra bir düzine oyuncu olması muhtemel yok ama potansiyel oyunların bir sayıda olabilir.

Is there a good way to figure out which would be more efficient? Thanks.

5 Cevap

Normalleştirme genelde iyi bir şeydir. Virgül tablolarda listeleri ayrılmış bir tablo yabancı anahtar muhtaç olduğu bir işaretidir. Eğer ekstra sorgular hakkında endişeli iseniz, check out JOINING

dbo.games
+----+----------+
| id |   name   |
+----+----------+
| 1  |    war   |
| 2  | invaders |
+----+----------+

dbo.players
+----+----------+---------+
| id |   name   | game_id |
+----+----------+---------+
| 1  |   john   |    1    |
| 2  |   mike   |    1    |
+----+----------+---------+

SELECT games.name, count(players.id) as total_players FROM games INNER JOIN players ON games.id = players.game_id GROUP BY games.name;

Result:
+-----------+--------------+
| name      |total_players |
+-----------+--------------+
| war       |       2      |
| invaders  |       0      |
+-----------+--------------+

Sidenote: Hokies git :)

Tanrım, CSV'leri kullanmayın lütfen! Ben SQL yeni olduğunuzda cazip olduğunu biliyorum, ama bu unqueryable olur ...

Sen 3 tablolar gerekir: games, players, ve players_in_games. oyunlar ve oyuncular her id gibi birincil otomatik artan anahtar olmalı, ve sonra players_in_games sadece iki alan, player_id ve game_id ihtiyacı . Bu ilişki, bir "çok çok" olarak adlandırılır. Bir oyuncu çok oyun oynayabilir ve oyun birçok oyuncu olabilir.

Doğru cevap, bir oyuncu kimliği ve satır başına bir oyun kimliği vardır PlayersInGames adında bir tablodur.

Ben oyuncuları ve oyunları bağlayan üçüncü bir tablo yaratacak. Sizin virgülle ayrılmış liste etkili üçüncü bir tablo, ama listenizi ayrıştırma neredeyse kesinlikle veritabanı sizin için bunu izin daha az etkili olacak.

Eğer OYUN tablodan bir satır kaldırmak ne olur kendinize sorun. Şimdi, tüm OYUNCU satırlar üzerinde döngü vardır listesini inceleyebilir, olanları kaldırıldı OYUN başvuru içeren anlamaya, ve sonra tüm listeleri güncellemek olacak.

Kötü tasarım. SQL bunun için doğdu ne yapalım. Sorgu indeksi düzgün yeterince hızlı olacaktır. Bu gibi mikro-optimizasyonlar yanlış bir yaklaşım vardır.