8

Veritabanımda User tablosu tasarlıyorum. Her kullanıcı için "izin ver" veya "izin verme" olabilecek yaklaşık 30 seçenek var.Birçok bit kaydetme - Birden fazla sütun mu yoksa tek bir bit sütununda mı kullanmalıyım?

Sorum, bunları 30 bit sütun olarak depolamalı mıyım yoksa bunları depolamak ve uygulamamdaki her bir biti ayrıştırmak için tek bir int sütun kullanmalı mıyım?

Ayrıca, veritabanı Ben bunu her değer için sütunlar varsa gelecekteki genişlemesi için izin vermek kolay olacağını düşünüyorum (çevreye bağlı olarak), SQL Server 2008 ve 2005

+1

@Martin Bu soruyu – Earlz

cevap

4

olduğunu. Gelecekte başka bir seçenek eklerseniz (ki bu da çoğu uygulama için muhtemeldir), yeni kodları hesaba katmak için int sütunu yeniden göndermeniz gerekeceğinden tüm diğer kodunuzu etkileyebilir.

5

Ne yazık ki - başka bir sistemle büyük bir yer sorunu veya uyumluluk gereksiniminiz olmadıkça, bu durumun sorgularınızı optimize etmenizi ve her bitin neyi temsil ettiğini açıkça anlamanızı nasıl sağlayacağını düşünün.

Bir tabloda binlerce sütundan oluşabilir veya kullanıcı ayarları için bir alt tablonuz olabilir. Kendinizi uygulamanızda ayrıştırmanız gereken 30 bit ile sınırlarsınız? Bu ayarlardan bazılarının kullanımdan kaldırılmasının veya yeni bir çiftin tanıtılması durumunda uygulamaya ne tür değişiklikler yapmanız gerektiğini düşünün.

4

Eğer bir bitflag alanıyla birleşirseniz, ham verilere bakarsanız neyin ayarlandığını görmek zor olacaktır. Her bir değer için tek tek sütunlarla giderdim veya seçenekleri kendi tablolarında saklardım.

11

Sadece iki tablo tek bir int sütunu ile bir 30 bitlik sütun ile bir oluşturma çalıştı daha sonra her bir satır ilave edildi ve 30 Bit tablo SQL Server Internals Viewer

CREATE TABLE T_INT(X INT DEFAULT 1073741823); 

CREATE TABLE T_BIT(
X1 BIT DEFAULT 1, 
/*Other columns omitted for brevity*/ 
X30 BIT DEFAULT 1 
); 

INSERT INTO T_INT DEFAULT VALUES; 

INSERT INTO T_BIT DEFAULT VALUES; 

tek satır ile onlara görünüyordu Sütunlar

BITS

bir int Sütun tablo tek sıralıgörünümüdür bir SQL Server depolama açıdan

INT

bit sütunlarından bir araya getiren ve veri alanı (sarı) tam olarak aynı miktarda depolanır.NULL bitmap (mor) için bir satır 3 bayt kaybetmekle bitiyor olsa da, bunun uzunluğu doğrudan doğruya sütun sayısıyla orantılı olduğundan (boş değerlere izin verilip verilmediklerinden bağımsız olarak)

Alanlar için anahtar (int için) versiyon, renk kodlaması) bit sürümü için aynıdır

Ben senin tasarım düzgün normalize olmalıdır katılıyorum Int key

+2

ekledim Teknik ayrıntıları vermek için +1 – Earlz

+0

Zaman zaman bozuk görüntüleri güncelleyecektir. –

+0

Ve bu nedenle gelecekte her zaman imgur kullanmalısınız;) – Earlz

1

, üç tablo Kullanıcı ve Kullanıcı ayarı, ve bir köprü tablosu:

Kullanıcı:

Kimliği int

KullanıcıAdı varchar (X)

UserSetting:

Settingid int

SettingName varchar (X)

UserUserSetting:

Userid int

SettingId int

Isset

bit

FK adlı UserSetting ve UserUserSetting köprü masaya ve Kullanıcı masa ve t KullanıcıNo eşsiz contr kısıtı arasında olacaktı, SettingId UserUserSetting

+1

+1 normalleştirme için Bravo bir şey yok. Ancak, 'UserUserSetting' gerekli. Bir satırın varlığı, kullanıcı ayarının kullanıcı için etkinleştirildiğini gösterir mi? – bobs

+2

Her kullanıcı ayarının bir varlık yerine bir özellik olarak ele alınması zorunlu olarak 1NF'yi ihlal etmemektedir. Sorunun ifade ediliş biçimi, ancak genel bir kavram olarak bir "kullanıcı ayarını" ele alır; Bu modelde kullanıcı ayarı bir varlıktır ve bir tabloya ihtiyaç duyar. Hangi yaklaşımın daha uygun olduğunu anlamak için kullanıcı ayarlarının nasıl kullanıldığı ve spesifik örneklere ihtiyaç duyulduğu hakkında daha fazla bilgi gerekir. –

İlgili konular