Tek sütunlu bir tablo iyi bir tasarım mı? [kapalı]


111

Tek sütunlu bir tablo olması uygun mu? Teknik olarak yasa dışı olmadığını biliyorum, ancak kötü tasarım olarak kabul ediliyor mu?

DÜZENLE:

İşte birkaç örnek:

  • 50 geçerli ABD eyalet koduna sahip bir tablonuz var, ancak ayrıntılı durum adlarını saklamanıza gerek yok.
  • E-posta kara listesi.

Birisi bir anahtar alan eklemekten bahsetti. Gördüğüm kadarıyla, bu tek sütun birincil anahtar OLACAKTIR.


Yalnızca tek sütunlu bir tablonun kullanım durumunu hayal etmekte biraz sorun yaşıyorum. Bir örnek verebilir misin?
Paul Morie

ama en azından bunun için bir Dizin oluşturmayın!
Sathya

3
ABD eyalet kodları, alan tanımlamanın klasik bir örneğidir
Quassnoi

3
Daha önce bir uygulama için kilit değerini tutan bir veritabanı tablosu gördüm
Russ Cam

Bu kalıp için kullanımım, veri kümeleri oluşturmaktı. Ana tablodaki her kaydın bir SET alanı vardır. Aynı SET'e sahip kayıtlar bağlanır. Aynı Küme ile birden çok kaydı nasıl eklersiniz? INSERT INTO sets VALUES () 've sonra kayıtlara eklemek için SET ID'niz olarak son insert ID'yi kullanın. Sonra tekrar, belki UUID'leri kullanabilirdim, ancak bunda bir şeyler yanlış geliyor.
William Entriken

Yanıtlar:


87

Evet, bir masayı en verimli hale getirecek şekilde tasarlamak kesinlikle iyi bir tasarımdır. "Kötü RDBMS Tasarımı" genellikle verimsizlik etrafında şekillenir.

Bununla birlikte, çoğu tek sütun tasarımının ek bir sütundan yararlanabileceğini buldum. Örneğin, Durum Kodlarında tipik olarak Tam Durum adı ikinci bir sütunda yazılı olabilir. Veya bir kara listenin ilişkili notları olabilir. Ancak, tasarımınız gerçekten bu bilgiye ihtiyaç duymuyorsa, tek sütuna sahip olmak tamamen uygundur.


168

Bu bağlamda, relational algebra" bu şey var " anlamına gelen tekli bir ilişki olacaktır.

Evet, böyle bir ilişkiyi tanımlayan bir tabloya sahip olmak iyidir: örneğin, bir alanı tanımlamak için.

Böyle bir tablonun değerleri elbette doğal birincil anahtarlar olmalıdır.

prime numbersİlk aklıma gelenler için bir arama tablosu .


3
+1: Tablo, RDBMS'nizin ilkel türleri olan bir değerler kümesidir.
S.Lott

4
İlişkisel teoriye dayalı yanıt sağlamak için +1.
lubos hasko

İşte doğal anahtar olmayan 1 sütunlu bir tabloya sahip bir şema örneği, mesajlaşma sistemindeki İş Parçacığı tablosu ... stackoverflow.com/a/6542556/45767
JeremyWeir

29

Onları geçmişte kullandım. Bir müşterim, sahip olduğu bu büyük listedeki bir telefon numarasıyla kaydolmaya çalışan herkesi otomatik olarak engellemek istedi, bu yüzden bu sadece büyük bir kara listeydi.


19

Bunun için geçerli bir ihtiyaç varsa, o zaman bir sorun görmüyorum. Belki sadece bir sebepten dolayı görüntülenecek bir olasılıklar listesi istiyorsunuz ve bunu dinamik olarak değiştirebilmek istiyorsunuz, ancak onu başka bir tabloya bağlamanıza gerek yok.


+1 - Sonuç olarak, kitabımdaki doğru cevap bu
Mark Brittingham

Kısa ve net cevap için +1.
Matthew Jones

3
Neden bir sütunlu tablo başka bir tabloya bağlanamıyor?
Aheho

2
Neden olmasın? Durum kodu tablosunu örnek olarak alın. Neden bunu adres alanları olan başka bir tabloya karşı bir foriegn anahtar kısıtlaması olarak kullanmıyorsunuz?
Aheho

1
Bu, iyi bir fikir olacağı zamanlara harika bir örnek.
Kevin

11

Bazen bulduğum bir durum şuna benzer:

Tablo country_id , her ülke için sayısal kimliği olan yalnızca bir sütun içerir.

Tablo country_description , ülke kimliğine sahip bir sütun, dil kimliğine sahip bir sütun ve yerelleştirilmiş ülke adını içeren bir sütun içerir.

Şirket_factories tablosu, Wich'in bulunduğu ülke de dahil olmak üzere şirketin her fabrikasına ait bilgileri içerir.

Bu nedenle, veri tutarlılığını ve tablolarda dilden bağımsız verileri korumak için veritabanı, bu şemayı, dil bağımlılıkları olmadan yabancı anahtarlara izin vermek için yalnızca bir sütunlu tablolarla kullanır.

Bu durumda tek sütunlu tabloların varlığının haklı olduğunu düşünüyorum.

Yoruma yanıt olarak düzenleyen: Quassnoi


(kaynak: ggpht.com )

Bu şemada, company_factories tablosunda, tabloya Dil sütununu eklememi gerektirmeyen bir yabancı anahtar tanımlayabilirim, ancak country_id tablosuna sahip değilsem, yabancı anahtarı tanımlamak için tabloya Dil sütununu eklemeliyim .


2
Neden country_id kullanıyorsunuz? Bir ülke eklemek için, adını en az bir dilde bilmeniz gerekir ve bu, country_description içinde bir country_id ile sonuçlanacaktır. Ülkelerin açıklaması olmayan bir country_id anlamsızdır. "COALESCE Başkanı Sayın Barack Obama (14243, ülke_adı) GERİ DÖNEN NULL DEĞER, bugün Россия Başkanı Dmitry Medvedev ile bir araya geldi"
Quassnoi

4
@Doliveras: Tamam, şimdi anlıyorum, +1. Bununla birlikte, coutry_code için ISO 3166-1'i kullanmayı tercih ederim. Sayısal kimliğin aksine, 3 harfli bir ülke kodu, Latin alfabesini okuyabilen hemen hemen dünyadaki herkese hangi ülkenin bahsedildiği konusunda fikir verir.
Quassnoi

İşte doğal dil çevirilerini aynı tabloya yerleştirmek için uyguladığım başka bir yol. Verilen, sonuç olarak birçok alan boş değer atanabilir, ancak veri bütünlüğünü özel tetikleyicilere aktarabilirsiniz. . "DBA" "myLocalisedTable" ( "entry_id" tamsayısı NULL STANDART AUTOINCREMENT, Tam NULL, "master_entry_label" VARCHAR (200) NULL, TAMSAYILI NULL, "localised_entry_label" VARCHAR (300) NULL "Dil_Kimliği" "master_entry_id" TABLO OLUŞTURMA
Vincent Buck

7

Tek sütunlu bir tablonun anlamlı olduğu nadir durumlar olabilir. Geçerli dil kodlarının listesinin yabancı anahtar olarak kullanılan tek sütunlu bir tablo olduğu bir veritabanı yaptım. Anahtarın kendisi kod olduğu için farklı bir anahtara sahip olmanın bir anlamı yoktu. Dil kodu açıklamaları bazı bağlamlar için dile göre değişeceğinden sabit bir açıklama yoktu.

Genel olarak, herhangi bir ek özniteliği olmayan yetkili bir değerler listesine ihtiyaç duyduğunuz her durum, tek sütunlu bir tablo için iyi bir adaydır.


5

Uygulama tasarımının zaten bir veritabanı kullanıp kullanmadığına bağlı olarak her zaman tek sütunlu tablolar kullanıyorum. Bir veritabanı bağlantısı kurmanın tasarım yüküne katlandıktan sonra, tüm değiştirilebilir verileri mümkün olduğunca tablolara koyarım.

Tek sütunlu tablolar OTMH'nin iki kullanımını düşünebilirim:

1) Veri öğesi mevcuttur. Genellikle açılır listelerde kullanılır. Ayrıca basit meşruiyet testleri için de kullanılır.

Örneğin. iki harfli ABD eyalet kısaltmaları; Gönderdiğimiz posta kodları; Scrabble'da yasal sözcükler; vb.

2) Seyrek ikili öznitelik, yani büyük bir tabloda, yalnızca birkaç kayıt için doğru olacak bir ikili öznitelik. Yeni bir boole sütunu eklemek yerine, özniteliğin true olduğu kayıtların anahtarlarını içeren ayrı bir tablo oluşturabilirim.

Örneğin. ölümcül hastalığı olan çalışanlar; 360 günlük bir yıla sahip bankalar (çoğu 365 kullanıyor); vb.

-Al.



4

Çoğunlukla bunu, tanımladığınız durum tablosu gibi arama türü tablolarında gördüm. Ancak, bunu yaparsanız, benzersizliği zorlamak için sütunu birincil anahtar olarak ayarladığınızdan emin olun. Bu değeri benzersiz olarak ayarlayamıyorsanız, tek sütun kullanmamalısınız.


Burada tek bir sütun kullanmak muhtemelen iyi olsa da, diğer sütunlarda da benzersizlik kısıtlamaları ayarlayabileceğinizi unutmayın.
Stealth Rabbi

2

Genel olarak evet derdim. Neden sadece bir sütuna ihtiyacınız olduğundan emin değilim. Bunun etkili bir şekilde kullanıldığını gördüğüm bazı istisnalar var. Neyi başarmaya çalıştığınıza bağlı.

Veritabanının şemasını düşündüğünüzde gerçekten iyi bir tasarım değillerdir, ancak gerçekten yalnızca yardımcı program tabloları olarak kullanılmalıdır.

Geçmişte sayı tablolarının etkin bir şekilde kullanıldığını görmüştüm .


1

Bir veritabanının amacı, bilgi parçalarını birbiriyle ilişkilendirmektir. İlişkilendirilecek veri olmadığında bunu nasıl yapabilirsiniz?

Belki bu bir tür derleme tablosudur (örn. FirstName + LastName + Birthdate), ancak bunu neden yapmak isteyeceğinizden hala emin değilim.

DÜZENLEME: Bu tür bir tabloyu bir tür basit liste için kullanmayı görebiliyordum. Bunu bunun için mi kullanıyorsun?


9
Hayır, bir veritabanının birincil amacı bilgi depolamaktır.
Spencer Ruport

Ancak bir elektronik tablo bilgi depolayabilir. Ve eğer bilgi, aralarında korelasyon olmayan bir grup ayrık sayı ve harf ise nasıl yararlıdır?
Matthew Jones

Bilgi yararlı olabilir çünkü veritabanını kullanan uygulama buna ihtiyaç duyar ve sabit bir küme değildir. Yani, DB, ilişkisel veya başka türlü bir veritabanı uygulaması tarafından kullanılacak bilgileri koymak için en uygun yerdir. İlişkisel ideale göre saflığımızı kanıtlamak için uygulamalar geliştirmediğimizi kabul edeceğinizden oldukça eminim. Bunun yerine, faydalı olacak uygulamalar geliştiriyoruz.
Mark Brittingham

@Mark - Basit bir liste ile bunu kastettim. Sanırım kendimi çok iyi açıklamadım.
Matthew Jones

1
@SR - Hayır, bir veritabanının birincil amacı bilgi almaktır. İlgilenilen satırlar diğer veri parçalarına bağlı olduğundan çoğu kez MJ'in orijinal yorumunun geçerli olduğunu düşünüyorum.
CurtainDog

1

Evet, alan, söylediğin gibi birincil anahtar olduğu sürece. Bunun nedeni, yinelenen verileri eklerseniz bu satırların salt okunur olacağıdır. Yinelenen satırlardan birini silmeye çalışırsanız. çalışmayacaktır çünkü sunucu hangi satırı sileceğini bilmeyecektir.


2
Saçma. Birincil anahtar veya kısıtlama olmaksızın bir silme işlemi, eşleşen tüm satırları yok saymayacak, silecektir.
Erik Funkenbusch

1
"Çalışmıyor" derken, "beklendiği gibi çalışmıyor" anlamına gelebilir, "hey bir satırı sildim ama ikisi de gitti" koşulunu kapsar.
GWLlosa

Veya, SSMS'deki bir kaydı "Açık Tablo" görünümünden silmeye çalışırsanız, aslında kaydın benzersiz şekilde tanımlanamayacağı ve sonra hiçbir şey yapmayacağı bir iletişim kutusu açacaktır ...
Michael Fredrickson

-1

Düşünebildiğim tek kullanım durumu, belki bir kelime oyunu için bir kelime tablosu. Sadece bir dizenin bir kelime olduğunu doğrulamak için tabloya erişirsiniz: kelime =? Olan kelimelerden kelime seçin. Ancak, bir kelime listesi tutmak için ilişkisel bir veritabanından çok daha iyi veri yapıları vardır .

Aksi takdirde, bir veritabanındaki veriler, verilerin çeşitli nitelikleri arasındaki ilişkilerden yararlanmak için genellikle bir veritabanına yerleştirilir. Verilerinizin değerinin ötesinde hiçbir özelliği yoksa, bu ilişki nasıl geliştirilecek?

Yani, yasa dışı olmasa da, genel olarak muhtemelen tek sütunlu bir tablonuz olmamalıdır.


Buna benzer şekilde, döngüyü durdurmak için çok kullanışlı olan sayılar tablosu.
u07ch

-1

Tüm tablolarımda en az dört teknoloji alanı, seri birincil anahtar, oluşturma ve değiştirme zaman damgaları ve yumuşak silme boole değeri var. Herhangi bir kara listede, girişi kimin eklediğini de bilmek isteyeceksiniz. Bu yüzden benim için cevap hayır, tek sütunlu bir tablo, bir şeyin prototipinin oluşturulması dışında bir anlam ifade etmeyecektir.


1
Bir veri tablosunu bir işlem tablosuyla karıştırıyorsunuz gibi görünüyor. Bence bunlar iki ayrı şey olmalı.
Josh Noe

-2

Evet bu çok iyi. ama bir kimlik alanı ona zarar veremez mi?


7
Aslında olabilir. Kesin bir geçerli değerler listesine sahip olduğunuzda, isteyeceğiniz son şey bir kimlik alanıdır çünkü bu, değerlerin benzersiz olmadığını ima eder. Eğer 'LightBlue' bir anahtar ise, o zaman birinin id 1 olan 'LightBlue'nun 4 numaralı' LightBlue'dan farklı olabileceğini düşünmesini istemezsiniz.
Jeremy Bourque

Kimliğin kimlik olması gerektiğini kim söylüyor? Veya anahtarın bir parçası?
Eric

3
Yapay bir anahtar olabilir ve orijinal alanın üzerinde benzersiz bir kısıtlaması olabilir.
Mark Canlas
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.