2010-12-27 28 views
14

Birincil anahtar sütununun uzunluğu sınırı nedir? Varchar'ı birincil anahtar olarak kullanacağım. PostgreSQL'in birincil anahtar olarak kullanıldığında varchar limitini belirtmesi gerekmediği için ne kadar bilgi, ne kadar süre bulamadım?PostgreSQL birincil anahtar uzunluğu sınırı

+2

Görüyorum ki, böyle birincil anahtarda çok fazla veri koyabilirim, ama bu iyi bir fikir değil. Bütün cevaplar için teşekkürler. Varchar'ın kötü bir PK olduğunu bildiren – FolksLord

cevap

6

Maksimum varchar uzunluğunun Postgres yapılandırma ayarı olduğuna inanıyorum. Ancak, boyut olarak 1 GB'ı geçemeyeceği anlaşılıyor. Dedi sahip

http://wiki.postgresql.org/wiki/FAQ#What_is_the_maximum_size_for_a_row.2C_a_table.2C_and_a_database.3F

, bir birincil anahtar olarak büyük bir varchar sütunu olması muhtemelen iyi bir fikir değil. Bir seri veya bigserial kullanmayı düşünün (http://www.postgresql.org/docs/current/interactive/datatype-numeric.html#DATATYPE-SERIAL)

+0

+1. Bu, referans tablolarda kullanıldığında kötü performans verecektir (bağlantınızı en son PG sürümüne değiştirdim). – DrColossos

+2

@DrColossos: Başka bir tabloda Yabancı Anahtar olarak belirtilen varchar alanını kullanıyorsanız, bu SADECE doğrudur. Eğer bu alanın sadece UNIQUE ve NOT NULL * ve * sadece bir tabloda başvurulan olması gerekiyorsa, sayısal bir "PRIMARY KEY" kelimesinin eklenmesi size gerçekten zarar verecektir. Artık sayısal NUMAR * ve * ek NUMARALI DEĞERLENDİRME NOT sütununda (veri bütünlüğünü sağlamak için gerekli) hem ek yüküne hem de karşı çıkacaksınız. Yabancı anahtarlardan bahsederken, ama "varchar kötü bir PK" demek yanıltıcıdır. –

+0

@Matthew Takip ettiğiniz için teşekkürler: D Detayların ve yorumumu nasıl yorumlayacağımı tam olarak bilmiyordum. "[...] referans tabloları içinde kullanıldığında [...]", Yabancı Anahtarları kastettiğim kadar açıktı, ancak bu konu hakkında daha fazla bilgi verdiniz. Şimdi daha iyi biliyorum, teşekkürler! – DrColossos

19

Birincil anahtarlar içeren B-ağacı dizinindeki bir değer için maksimum uzunluk, varsayılan sayfa olarak bir arabellek sayfasının boyutunun üçte biridir (8192/3). = bayt.

4

Test yapmalısınız.

PostgreSQL 8.4'de birincil anahtar olarak tek varchar sütuna sahip tabloyla testler yaptım. Sonuç olarak, 235000 ASCII karakterini, 116000 polonyalı diacetik karakteri (örn. 'Ć') veya 75000 çince (ör. '汉') saklayabildim. Daha büyük kümeler için bir mesajım var:
BŁĄD: dizin satır boyutu 5404, btree maksimum değerini aşar, 2712
Ancak, ileti şu yanıtı verdi:
Bir arabellek sayfasının 1/3'ünden daha büyük değerler dizine eklenemez.
Bu nedenle değerlere izin verildi, ancak tüm dize benzersizlik denetimi için kullanılmadı.

Bu sütuna koyabileceğiniz çok büyük miktarda veri var. Ancak, yukarıda belirtildiği gibi, anahtarlarınız gibi uzun değerleri kullanmak zorunda kalırsanız tasarımınız zayıf olur. Yapay birincil anahtarı kullanmalısınız.

İlgili konular