Таблицы SQL - шаблон для / или данных - PullRequest
2 голосов
/ 03 марта 2009

У меня быстрый вопрос - есть ли лучшая практика в дизайне таблиц 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 установлено значение true, я знаю, что будет правило (определенное для внешнего ключа), но если нет, я буду использовать значение, сохраненное в имени папки.

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

Ответы [ 4 ]

7 голосов
/ 03 марта 2009

Это выглядит не так уж плохо для меня.

Возможно, вы захотите не беспокоиться о поле «IsDynamic», поскольку это может быть получено из того факта, что DynamicFieldID имеет значение null Затем в вашем SQL вы можете оставить соединения и объединить поля из динамических таблиц.

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

4 голосов
/ 03 марта 2009
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)
)
1 голос
/ 03 марта 2009

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

SELECT COALESCE(dynamicName, folderName)
FROM folder
LEFT JOIN dynamicField ON (dynamicField.ID = folder.DynamicFieldID)
0 голосов
/ 03 марта 2009

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

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

значение: / companyA / projectA /

или

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...