2009-03-03 5 views
2

У меня есть быстрый вопрос - есть ли наилучшая практика в дизайне SQL Table для хранения данных «или/или»?Таблицы SQL - шаблон для данных или данных

У меня проблема: мне нужно хранить данные шаблона (определение структуры папок) в таблице SQL. Любая папка может иметь статическое имя (например, «Электронная почта») или может быть динамически сгенерирована для каждого экземпляра в зависимости от связанных с ней объектов (например, название компании).

При создании экземпляра бизнес-объекта данные шаблона будут использоваться для создания фактической структуры папок.

Я имею в виду хранения данных, как это:

 
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 
) 

Так что, если IsDynamic поле установлено верно, я знаю, что там будет правило (определяется по внешнему ключу), но если не я будет использовать значение, сохраненное в имени папки.

Однако это кажется немного грязным для меня - есть ли «лучшая практика» для такого сценария?

ответ

7

Это не выглядит слишком плохо для меня.

Возможно, вы захотите не беспокоиться о поле «IsDynamic», поскольку это может быть получено из того факта, что DynamicFieldID имеет значение NULL. Затем в вашем SQL вы могли бы ВСПОМОГАТЬ JOIN и COALESCE поля из динамических таблиц.

Но я не думаю, что вышеупомянутая модель - это все, что грязно.

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

Привет Patrick - спасибо за это. Я рассматривал это, но был подвешен на решение, было ли это лучше или хуже, чем мое дело. Каково ваше мнение о том, почему это лучше (или что вы считаете «за» и «против»)? – Chris

+0

Если у вас было более двух типов папок или более двух столбцов, этот подход может оказаться более чистым, чем попытка сохранить все в одной таблице. Однако, поскольку он стоит, я думаю, что предложение Криса COALESE более практично.Я бы принял его ответ. :-) –

-1

Я не уверен, что я понять вопрос точно, но я думаю, что вы говорите, что у вас есть поле, которое может иметь либо статическое значение или тот, который должен быть определен во время выполнения на основе другого значения.

Я бы создал вашу собственную «переменную» схему и сохранил ее в базе данных. Я не знаю, на каком языке вы используете, и поэтому я придумал бы что-то на основе этого (сделайте его отличным от вашего языка), и я буду использовать что-то, окружающее ценность - начало и конец. Так, например:

значение:/CompanyA/Projecta/

или

значение/@ companyVariable @/@ projectVariable @/

затем просто написать рутина ищет для открытия и закрытия @ знаков и замените их соответствующими значениями. Это немного больше работы, но я думаю, что это было бы самым легким в конце концов и самым гибким. Опять же, знаки @ - это то, о чем я думал в первую очередь, использовать любые персонажи, которые имеют для вас наибольший смысл.

+0

Кто-нибудь хочет прокомментировать, почему меня проголосовали? Был ли мой ответ некорректным? Если это плохая идея, помните, почему? –

1

Вы можете просто NULL в DynamicFieldID и запрос так:

SELECT COALESCE(dynamicName, folderName) 
FROM folder 
LEFT JOIN dynamicField ON (dynamicField.ID = folder.DynamicFieldID) 
Смежные вопросы