2009-03-03 18 views
2

Hızlı bir sorum var - SQL Tablo tasarımında "ya/veya" veri depolamak için en iyi yöntem var mı?SQL Tabloları - Her iki/veya için desen

Aşağıdaki sorunla karşılaşıyorum - Şablon tablosunu (klasör yapısını tanımlama) bir SQL tablosunda depolamam gerekiyor. Herhangi bir klasörde bir statik ad (örneğin "E-postalar") olabilir veya her bir nesne için ilişkili nesneye bağlı olarak dinamik olarak oluşturulmuş olabilir (ör. Şirket Adı).

Bir iş nesnesi başlatıldığında, şablon verileri gerçek klasör yapısını oluşturmak için kullanılacaktır. IsDynamic alan true ayarlanırsa

 
CREATE TABLE folder 
(
    ID INT IDENTITY PRIMARY KEY, 
    FolderName NVARCHAR(50), 
    IsDynamic BIT NOT NULL DEFAULT 0, 
    DynamicFieldID INT FOREIGN KEY REFERENCES dynamicField, 
    ParentID INT FOREIGN KEY REFERENCES folder 
) 

yüzden (yabancı anahtar üzerinde tanımlı) bir kural olacağını biliyorum ama eğer ben değil:

böyle verileri depolamak düşünüyorum klasör adında kayıtlı değeri kullanacaktır. Ancak bu durum benim için biraz dağınık gibi görünüyor - bu tür bir senaryo için “en iyi uygulama” modeli var mıdır?

cevap

7

Bu bana çok kötü gelmiyor.

"IsDynamic" alanıyla uğraşmayı düşünmemek isteyebilirsiniz çünkü DynamicFieldID'nin boş olması gerçeğinden kaynaklanabilir. Ardından, SQL'inizde, Dinamik tablolardan alanları KATILABİLİRSİNİZ ve COALESCE. Ancak yukarıdaki modelin bu kadar karışık olduğunu düşünmüyorum.

4
CREATE TABLE folder 
(
    ID INT IDENTITY PRIMARY KEY, 
    ParentID INT FOREIGN KEY REFERENCES folder 
) 

CREATE TABLE dynamic_folder (
    ID INT FOREIGN KEY REFERENCES folder (id), 
    DynamicFieldID INT FOREIGN KEY REFERENCES dynamicField 
) 

CREATE TABLE static_folder (
    ID INT FOREIGN KEY REFERENCES folder (id), 
    FolderName NVARCHAR(50) 
) 
+0

Selam Patrick - bunun için teşekkür. Bunu düşünüyordum ama bu durumun daha iyi veya kötü olup olmadığına karar vermek için asıldı. Bunun neden daha iyi olduğuna dair fikriniz nedir (ya da artıları ve eksileri olarak ne düşünüyorsunuz?) – Chris

+0

İkiden fazla türde klasörünüz varsa veya ikiden fazla sütun etkilendiyse, bu yaklaşım her şeyi tek bir tabloda tutmaya çalışmaktan daha temiz olabilir. Bununla birlikte, Chris'in COALESE önerisinin daha pratik olduğunu düşünüyorum.Cevabını kabul ediyorum. :-) –

-1

Ben tam soru anlayışlıyımdır emin değilim ama ne diyorsun diğer dayanan zamanında belirlenir gereken bir statik değer veya bir ya sahip bir alan olduğunu düşünüyorum değerler.

Kendi "değişken" planınızı oluşturabilir ve bunu veritabanında saklarım. Hangi dili kullandığınızı bilmiyorum ve bu yüzden ona göre bir şeyler buldum (dilinizden farklı hale getirin) ve değeri çevreleyen bir şey kullanırdım - başlangıç ​​ve bitiş. Yani, örneğin:

değeri:/Companyâ/PROJECTA/

veya

değeri/@ companyVariable @/@ projectVariable @/

sonra sadece rutin açılması arayan ve işaretler @ kapanış yazma ve bunları uygun değerler ile değiştirin. Biraz daha fazla çalışma, ama sonunda ve en esnek olanı anlamanın en kolayı olacağını düşünüyorum. Yine, @ işaretleri ilk düşündüğüm şeydir, hangi karakterleri sizin için en anlamlı hale getirirse kullanın.

+0

Oylanım neden reddedildi? Cevabım bir şekilde yanlış mıydı? Kötü bir fikirse, nedenini belirtin? –

1

sadece DynamicFieldID içinde NULL olabilir ve sorgu şöyle:

SELECT COALESCE(dynamicName, folderName) 
FROM folder 
LEFT JOIN dynamicField ON (dynamicField.ID = folder.DynamicFieldID)