Oracle tablo / sütun / dizin adları neden 30 karakterle sınırlıdır?


149

Yıllar önce bu tür bir sınırlama olacağını anlayabilirim, ancak bugünlerde bu sınırın kolayca artırılabileceğini düşünüyorum. Nesneler için adlandırma kurallarımız var, ancak her zaman bu sınıra ulaştığımız yerde ortaya çıkan bir durum var - özellikle yabancı anahtarları adlandırırken.

Aslında bunun neden daha büyük bir boyut olmadığını veya 11g'de daha büyük olduğunu bilen var mı?


Görünüşe göre cevap şu anda defansif olarak kodlanmamış scriptleri kıracak. Ben Oracle olmaya çalışıyor, bu çok endişe verici bir şey olduğunu söylemek aksi takdirde ürün bin bir darbeyle ölümü ölecek, mutlaka bu sürekli iyileştirmek gerektiğini şey türüdür, veritabanı.

Bu tür bir itirazı şirket içinde her gördüğümde, mermiyi ısırmanın ve çözmenin zamanı geldiğini düşünüyorum. İnsanlar Oracle sürümlerini yükselttiklerinde kontrol etmeyen veya bakım yapmayan komut dosyaları çalıştırıyorsa, bu seçimin sonuçlarına maruz kalmalarına izin verin. Onlara 4000'e kadar bir uyumluluk bayrağı sağlayın, ardından adın 'Tamam' olup olmadığını kontrol etmek için sürekli olarak 30'a saymak zorunda kaldığımda nesneler oluştururken harcanan zamanı kurtarın.


3
Bir sınır olması gerektiğinden? 64 karakter olun ve muhtemelen neden 128 vb olmadığını soran birini bulacaksınız. Bir ip parçası ne kadardır?
Başkan

45
Doğru, ama 30 çok kısa bir ip parçası. Neden 4000 - Varchar2 büyüklüğünde - olamaz Oracle, sorguyu ayrıştırdıktan sonra ne kadar sürdüğünü gerçekten önemsiyor?
Chris Gill

22
@TheChairman PostgreSQL beni 63 karakterle sınırlandırdı ve bu uzunluk sınırında hiç sorun yaşamadım. İsimlerimin sığacağı kadar büyük ve daha uzun bir isim düşünürsem, okunabilirlik üzerindeki olumsuz etkiyi düşünmeye başlama zamanı. Flip tarafında, genellikle Oracle'da ad uzunluğu sınırlarıyla karşılaşıyorum ve 30 karakter sınırı nedeniyle adımın okunabilirliğini azaltmak zorunda kalıyorum. Birkaç kişi 64 sınırından şikayet edebilir, ancak birçok insan 30 karakter sınırından dolayı zaten sorun yaşıyor. Kullanım örneklerinin% 99'unu karşılamakla ilgilidir ve Oracle burada başarısız olur.
jpmc26

1
Hadi, Oracle, sen bir Dinozor oldun! Microsoft, SQL sunucusunu daha kolay hale getirmek için iyi bir iş çıkarıyor. Şimdi ad uzunluğu kısıtlamasını gevşetin.
user3454439

1
Oracle 12cR2'ye hızlı ilerleyin, artık 30 yerine 128 bayt :-) docs.oracle.com/tr/database/oracle/oracle-database/12.2/newft/…
Stefan L

Yanıtlar:


71

ANSI standardı olduğuna inanıyorum.

DÜZENLE:

Aslında, bunun SQL-92 standardı olduğunu düşünüyorum.

Standardın sonraki bir sürümü isteğe bağlı olarak 128 karakter adına izin veriyor gibi görünüyor, ancak Oracle henüz bunu desteklemiyor (veya 30 karaktere izin verdiği sürece kısmi desteğe sahip.)

Bu sayfada "F391, Uzun tanımlayıcılar" için arama yapın ... http://stanford.edu/dept/itss/docs/oracle/10g/server.101/b10759/ap_standard_sql001.htm

(Bir ref arıyorsunuz)


1
Hmm, bu belgeyi böyle okumadım. Bana F391'in SQL / Foundation özelliklerinde (ne olursa olsun) bir öğe olduğunu ve Oracle'ın 30 karakter sınırlamasıyla kısmi desteğe sahip olduğunu söylüyor.
skaffman

21
Kısmen uyumluluk. Ne şaka ama. "Vidalarımız metrik olmadıkları sürece metrik standartlarına kısmen uygundur."
Jens Schauder

5
F391 spesifikasyonunu ayrıntılı olarak okumadım, ancak (belki de yanlış) "Uzun tanımlayıcıların" tanımlayıcı uzunluğunda 30'dan 128'e bir artış anlamına geldiğini varsayıyorum. Yani, 30 karaktere izin vererek bunu "kısmen" desteklediğinizi biraz arsız. Yeni standardı desteklemiyorsunuz, yine de eski standardı destekliyorsunuz (yeni standarda giden yolun% 25'i olsa da) Bu anlamlı mı? !!?
cagcowboy

7
SQL-92 standardı burada katkıda bulunmaktadır. Andrew.cmu.edu/~shadow/sql/sql1992.txt , ancak "17.1 SQL öğe tanımlayıcı alanlarının açıklaması" bölümünü okursanız , adlar ve şemalar gibi tanımlayıcıların en az 128'e izin vermesi gerektiğini söylüyor karakter.
Rick

46
Oracle fanboylarının 30'dan fazla karakter tanımlayıcısının kullanışlılığını görmemesi rahatsız edici. "Adlarınızı anlamlı / açıklayıcı yapın, deve kılıfı yerine alt çizgi kullanın ve 30 karakterin altında kalın". Bu asla 30 karakteri aşmaz. Amirite? Daha çok kısaltmalarınızı kısaltmak gibi ve adlardan hiçbiri anlamlı olmadığında, tüm günü belgeleri okumak / güncellemek için harcayın.
Adam Jones

45

Cagcowboy'un SQL standardından türettiği noktaya ek olarak (tarihsel olarak, Oracle'ın SQL standardizasyonunu önceden planladığı için Oracle'ın kararının SQL standardına yol açtığından şüpheleniyorum), daha uzun tanımlayıcılara izin verme konusundaki isteksizliğin büyük bir kısmının tanımlayıcıların 30 karakter uzunluğunda olduğunu varsatan milyonlarca özel komut dosyası içeren milyonlarca DBA olduğunu fark etmek. Gibi bir şeye giden her kod satırına izin vermek

  l_table_name VARCHAR2(30);
BEGIN
  SELECT table_name
    INTO l_table_name
    FROM dba_tables
   WHERE ...

DBA 15 yıl önce DBA_TABLES.TABLE_NAME%TYPEsenaryo yerine VARCHAR2 (30) kullandığı için aniden kırılmak büyük isyana neden olacaktı. Yalnızca Oracle'ın yıllar boyunca bu tür şeylerin çeşitli paketler ve bileşenlerde yapıldığı binlerce yere sahip olduğundan bahse girerim. Tüm Retrofitting uzun tanımlayıcıları desteklemek için kod mevcut neredeyse kesinlikle üretecek muazzam bir proje olacağını yolu o faydalar sağlayacağından daha fazla geliştirici zamanında maliyetleri, QA zamanı ve yeni tanıtılan hataları.


13
+1 Bu neredeyse kesinlikle Oracle'ın birçok eski tasarım sakatlarından biridir.
skaffman

43
Elbette bir çift büyütme ve artırma zamanı - bir bayrak ekleyin, böylece DBA'lar onu 30'a kadar iyileştirebilir. başka bir şeye
Chris Gill

6
Sadece milyonlarca satır DBA yazılı kod değil, aynı zamanda bol miktarda oracle iç kodu da şüphesiz. Bu konu steven feuerstein ile bir oturumda gündeme geldi ve hiç değiştirmeyeceklerini düşünmediğini söyledi.
Matthew Watson

10
Tam olarak yeni bir özellik olarak trompet edemezlerdi ... sınırı genişletmek için çok zaman harcayacaklar ve "artık 30 karakterden uzun isimler kullanabilirsiniz!" Onlar gülünç stok olurdu.
skaffman

9
Hâlâ 15 yaşındaki komut dosyaları kullanıyorsanız, bir şeyler son derece yanlıştır . Ayrıca, bunları düzeltmek tek seferlik bir maliyet olacaktır (muhtemelen devam eden bakım için biraz daha fazlası ile), geliştiriciler ise gereksiz derecede kısaltılmış isimleri süresiz olarak hazırlamak için zaman kaybetmeye devam edecektir. @skaffman Zaten bir kahkaha değil ben endişeleniyorum kadarıyla, bunu (ve hiçbir mantıksal veya otomatik artan türleri gibi modern çağda acıklı diğer tasarım kararları bir dizi) sabitleme.
jpmc26

11

Bunu araştırıyordum ve bu soruyu Google üzerinden buldum, ancak Oracle 12c Sürüm 2 (12.2) itibariyle, artık tam olarak böyle olmadığını öğrendim. ( https://oracle-base.com/articles/12c/long-identifiers-12cr2 )

Bir noktada, her DBA veya geliştirici nesne adları için 30 karakter sınırının soruna neden olduğu bir noktaya çarpmış olacaktır. Bu sınır SQL Server veya MySQL'den Oracle'a geçiş projeleri yaparken son derece acı verici olabilir. Oracle Database 12cR2'de, çoğu tanımlayıcının maksimum uzunluğu artık 128 karakterdir.

Bu, 12.2'de ( http://blog.dbi-services.com/oracle-12cr2-long-identifiers/ ) yeni bir özelliktir . Bu mesaja göre, 12.1 hala 30 karakterle sınırlıydı.


Düzenleme: İşte değişikliği açıklayan resmi Oracle belgelerine bir bağlantı. ( https://docs.oracle.com/cloud/latest/exadataexpress-cloud/CSDBF/longer-identifier-names.htm#CSDBF-GUID-F4CA155F-5A37-4705-8443-0A8C9E3F875C )

Oracle Database 12c Release 2 (12.2) ile başlayarak, çoğu veritabanı nesnesi türü için tanımlayıcı adlarının maksimum uzunluğu 128 bayta çıkarıldı.


128 bayt / 4 bayt (Unicode) = 32 Karakter. En azından benim anlayışım, Unicode olmayan karakterler için 4 baytın bu kadar nadir olmadığını mı? Bunun sadece Unicode'u destekledikleri anlamına gelip gelmediğini merak etmeliyim? Tıpkı VARCHAR2(2)2 karakter değil 2 bayt anlamına geliyor.
Seth

1
Demek istediğim, ama bayt vs karakterler veritabanı karakter kümesine bağlıdır. Bu ayar, char veri tipleri için kodlamayı (varchar2 gibi) ve db tanımlayıcıları için kodlamayı belirler. Bu, nchar veri tipleri için kullanılan ulusal karakter kümesiyle zıttır. Yani evet, tanımlayıcılarınız karakter başına 4 bayt kullanacak şekilde bir kodlamanız varsa (DB karakter kümesi olarak kullanılabileceğini varsayarak), şimdi 7 yerine 32'ye sahip olacaksınız. Ancak çoğu kullanım durumu tanımlayıcısı için tek baytlık karakterler.
Kanmuri

6

Tanımlayıcı uzunluk sınırlarının pratik gerekliliği göz önüne alındığında, iyi tasarım, isimler birbiriyle ve önek ve soneklerle birleştirildiğinde tavana çarpmamak için gerçek isimlerin uzunluğunu kısıtlar.

Örneğin, yabancı anahtar kısıtlamalarını adlandırma sözleşmesi

FK_<table1>_<table2> 

tablo adlarını 13 veya daha az karakterle sınırlar; çoğu veritabanının tablo adlarının uzunluğunu daha da sınırlandıracak şekilde daha fazla önek ve son eke ihtiyacı olacaktır.


5

SQLERRM'de 255 karakterle sınırlı olan ve çoğu istemcinin hataları görünür kılmak için kullandığı kısıtlama ihlalleri bildirilir. Kısıtlama adlarının izin verilen boyutunun artırılmasının, ihlaller hakkında rapor verme yeteneğini önemli ölçüde etkileyeceğinden şüpheleniyorum (özellikle bir kısıtlama ihlali birkaç PL / SQL kodu katmanı aracılığıyla kabartıldığında).


Peki, o masayı daha geniş yap, o zaman?
skaffman

2
Bu bir tablo değil, ancak istemci yazılımının veritabanından nasıl hata aldığı.
Gary Myers

@skaffman SQLERRM uzunluğu bir API / ABI spesifikasyonudur. Bunu değiştirmek, gezegendeki her OCI sürücüsünü yamalamak zorunda kalacağı anlamına gelir (başka bir arabellek taşması). Sanırım, OCI 13'teki bufleni ve sunucuyu, Oracle 15 gibi bir şeyde OCI 10 istemcilerinin artık desteklenmeyeceği şekilde istemciye değiştirebilirler. (Belki şimdi bile düşünüyorlar, ancak oracle ana sürümü sadece birkaç yılda bir yayınlanıyor; ve sonra uygulamalar farklı sunucuya / istemciye taşındığında hala komut dosyası / uygulama yükseltme ağına girebiliriz).
cowbert

4

30 karakter tanımlayıcı uzunluğunun 1950'lerin sonunda standartlaştırılmış COBOL'dan geldiğine inanıyorum. COBOL programları SQL'in ana kullanıcısı (ve bundan önce SEQUEL (ve ondan önce QUEL)) olduğundan, tanımlayıcı uzunluğu için makul bir sayı gibi görünüyordu.


5
Oracle'ın ilk versiyonunun 31 tanımlayıcı uzunluk sınırına sahip olduğunu düşündüğüm Fortran'da yazıldığına inanıyorum. Belki de alakalı.
David Aldridge

4

Tüm bu 'kısıtlamalar', 70'lerden gelen işlemci mimarilerinin getirdiği sınırlamalara yanıt olarak bırakılmıştır. O zaman işlemcileri bu sınırlamaların artık gerekli olmadığı noktaya doğru evrildiklerinden; sadece geride kaldılar. Ancak, bunları değiştirmek RDBMS yazarları için BÜYÜK bir anlaşma. Bu uzunluk sınırlamaları, aşağı akıştaki her şeyi etkilediğinden, daha uzun bir prosedür adının yürütme raporlaması, veri sözlüğü, vb. Oracle RDBMS büyük bir yeniden yazma gerektirir.


2

Sorunun doğrudan cevabı, Oracle stilinin 30'un çok göründüğü eski fikirlerden miras alındığı ve çok daha fazlasının, tipik önbelleklerdeki sözlük önbelleğinin gerçek bellekten sabitlenmesi riskini artıracağı yönündedir.

Buna karşılık, ODBC ad alanı çok farklı bir yerden gelir, burada veri kümeleri bir Excel sayfasındaki bir tablo ayrıştırılarak hızlı bir şekilde çıkarılır ve otomatik olarak sayfa tablosu başlıklarından alınan sütun adlarıyla veritabanı tabloları oluşturulur. Böyle düşünmek, gömülü taşıma dönüşleri içeren tanımlayıcılara ve elbette özel karakterlere ve karışık kasaya bile izin verir. Bu mantıklı bir soyutlama çünkü günümüzün veri analistlerinin düşünce tarzını modelliyor.

SQL92'yi boşver, bugünün evrensel veritabanında gerçekten önemli olan ODBC uyumluluğu ve diğer satıcılar bunu Oracle'dan daha iyi ele aldı. Örneğin, birçoğu tarafından yaygın bir oyuncu olarak görülmeyen Teradata bile, İKİ ad alanlarına hitap eder, tırnak işaretleri olsun ve olmasın, birincisi 30 karakter sınırına sahiptir, ikincisi garip uzun tanımlayıcıların ikram edildiği tam bir ODBC uygulamasıdır. .

Geleneksel büyük veritabanı alanında bile, 30 karakter genellikle isimlerin anlamlı, tutarlı ve akılda kalıcı kalacağı bir sorundur. Rol adı verilen kalıtımla özelleşmiş yapılar tasarlamaya başladıktan sonra kısaltmaları kısaltmaya başlarsınız ve tutarlılık yakında ölür, çünkü örneğin bir tablo adı veya sütun adı olarak oluşturulan aynı kök tanımlayıcı bir durumda daha fazla kısaltmaya ihtiyaç duyar ve diğerinde . Önemli sayıdaki gerçek kullanıcılar bu tür katmanlara davet edildiyse sonuçlar çok zayıf kullanılabilirliktir ve neyse ki herhangi bir yaşlanan veritabanı için ana sürücü şimdi kullanıcıyı nesne katmanları ve BI araçları aracılığıyla veritabanından ayırmaktır.

Bu, veritabanı katmanını belki de rahatsız olmayan DBA'ya ve veri mimarı ekiplerine bırakır. Kısaltma planlarını çalışmak hala yaşam için bir iş gibi görünüyor.

Oracle'ın bu eski sınırlamaya değinmemesi, belki de daha uzun tanımlayıcılar kullanılarak oluşturulan veritabanı tasarımlarını doğrudan taşıyamayacağı zaman (henüz) rekabetine fazla iş kaybetmediği gerçeğini yansıtmaktadır.


Oracle için değil. ODBC, Microsoft değil, Java değil. It hala (- Eğer OCI sürücü ve ODBC instantclient fermuarlar hem ihtiyaç sırayla ODBC instantclient ile çalışan almak için instantclient dağıtıldığı nasıl bakmak) ayrı bir yardımcı OCI'ya karşı bağlantılı lib. Oracle'ın birincil istemci platformu (eski Pro * C / C / C ++ 'ın yanı sıra) ODBC'ye değil, doğrudan OCI'ye bağlı olan JDBC'dir.
cowbert

1

Yukarıdaki tüm yorumlar doğrudur, ancak daha uzun isimlerin performans maliyetini aklınızda bulundurmanız gerekir. 1990'ların başında, Informix büyük billboard "Oracle'dan Informix Daha Hızlı!" Oracle genel merkezinin yanındaki 101 numaralı rotada, Informix yalnızca 18 karakterden kısa tablo adlarına izin verdi! Nedeni açıktır - veri biçiminde tablo adları (yani 't138577321' yerine gerçek adlar veya gerçek bir şey olarak) Veri Sözlüğü'nde saklanır. Daha uzun adlar daha büyük Veri Sözlüğü'ne eşittir ve bir sorgu her bir sabit ayrıştırma gerektirdiğinde Veri Sözlüğü okunduğundan, daha büyük bir veri sözlüğü düşük performansa eşittir ...


7
Milyarlarca kez yapmazsanız, kısa dizelerin tam eşleşmesinin herhangi bir modern yazılımda bir darboğaz olması için kesinlikle hiçbir neden yoktur - sorgu ayrıştırmada durum böyle değildir. Oracle'ın bu kısmı ilk kez tasarlandığında boyut performansı ile ilgili önemli noktalar olabilir, ancak bu günlerde gerçekten alakalı değiller.
Sarah G

-7

tamam, sınırlama var ....

ama gerçekten bir tablo / dizin / sütun adlandırmak için 30'dan fazla karakter GEREKİR?

sorgular yazarken, bu sınırlama ile bazı sütun / tablo adlarını sinir bozucu buluyorum. Limit daha yüksek olsaydı, aşağıdaki gibi bir sorgu gerektiren tablolara girebilirim:

select unique_identifier_column, 
time_when_the_user_remembered_to_change_the_row_in_the_receipt_table, 
foreign_key_to_the_ap_invoice_distributions_history_table_related_to_the_all_rows_table 
from ap_invoices_really_really_all_all_rows_present_in_this_ebs_table.

Büyük kelimeler için özür dilerim: P


29
Yabancı anahtarları katıldıkları tabloların ve sütunların adlarıyla adlandırabilmeniz iyi olur - bu nedenle bir yabancı anahtar istisnası atıldığında başarısızlığa neden olan sütunlara bakmanız gerekmez. Sonra tekrar Oracle size sadece bu bilgiyi söyleyebilir ...
Chris Gill

10
30 karakterden fazlasına ihtiyacımızın birçok nedeni vardır, ancak genellikle 30 karakter yeterlidir. Bazen bir tablo adının anlamlı olacak kadar ayrıntılı olması gerekir. Örneğin, sch_PatternRunTimeException çağrı bu tablo var, tam olarak 30 karakter uzunluğunda. Şimdi, bir yansıtma tablo çağrısı sch_DevPatternRunTimeException eklemek gerekir. Bu ekstra 3 karakter adlandırma standardı Oracle için çalışmıyor, MSSQL'in bir sorunu yok. Bu beni yeni bir isim bulmaya zorluyor. Yeniden adlandırma tablosu yapılabilir, ancak müşterilerimizden kaçınmaya çalıştığımız işlemleri etkileyecektir.
dsum

6
Olası vakaların% 99,9'unda +30 karakter can sıkıcıysa, diğer% 0,1 kullanışlı olacağı anlamına gelmez.
René Nyffenegger

14
Ahhh kaygan eğim argümanı. Sadece 4 alfasayısal karakterden oluşan bir sınır bize 1 milyondan fazla masa kombinasyonunu getirecektir, bu yüzden kimsenin gerçekten 4'ten fazla “ihtiyacı yoktur”. Ve gerçekten 30 karakter değil, pascal vaka adlandırma kuralımın büyük / küçük harf duyarlılığı eksikliği ile doldurulması ve alt çizgi ile ayrılmış adlarla değiştirilmesi gerektiğinden, 30 karakterden az. Bunu çeşitli önek / soneklerle birleştirin ve hatta 20 karaktere sahip olduğunuz için şanslısınız. Kim güçlü bir dizin adı kısaltmalar ve alt çizgilerden oluşan bir gruptan dolayı ihlal hatasıyla yankılanmaz?
b_levitt

Bu konuyu ele almadığını kabul etti. Normalde insanlar daha uzun sütun adlarına ihtiyaç duymazlar, ancak nesne adlarının otomatik olarak oluşturulduğu birçok durum vardır.
fool4jesus
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.