我有一个简单的问题 - 在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,我知道将有一个规则(在外键上定义),但如果不是,我将使用存储在文件夹名称中的值。
然而,这对我来说似乎有点混乱 - 这种情况是否存在“最佳实践”模式?
答案 0 :(得分:7)
这对我来说并不是太糟糕。
您可能需要考虑不要使用“IsDynamic”字段,因为这可以从DynamicFieldID为空的事实中得出。然后在您的SQL中,您可以从动态表中LEFT JOIN和COALESCE字段。
但我认为上述模型并不是那么混乱。
答案 1 :(得分: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)
)
答案 2 :(得分:1)
您可以在NULL
中拥有DynamicFieldID
并进行查询:
SELECT COALESCE(dynamicName, folderName)
FROM folder
LEFT JOIN dynamicField ON (dynamicField.ID = folder.DynamicFieldID)
答案 3 :(得分:-1)
我不确定我是否完全理解了这个问题,但我认为你所说的是你有一个可以有静态值的字段,或者需要在运行时根据其他值确定的字段。
我会创建自己的“变量”方案并将其存储在数据库中。我不知道你正在使用什么语言,所以我会想出基于它的东西(使它与你的语言不同),我会使用围绕价值的东西 - 开始和结束。例如:
值:/ companyA / projectA /
或
value / @ companyVariable @ / @ projectVariable @ /
然后只需编写一个例程来查找打开和关闭@符号并将其与适当的值进行交换。这是一项更多的工作,但我认为它最容易理解,最灵活。再次,@符号正是我首先想到的,使用对你来说最有意义的任何字符。