SQL表-或数据的模式

SQL表-或数据的模式,sql,tsql,database-design,Sql,Tsql,Database Design,我有一个简单的问题-SQL表设计中是否有存储“非此即彼”数据的最佳实践 我有以下问题-我需要在SQL表中存储模板数据(定义文件夹结构)。任何给定的文件夹都可能有一个静态名称(例如“Emails”),也可能是为每个实例动态生成的,具体取决于与其关联的对象(例如公司名称) 实例化业务对象时,模板数据将用于创建实际的文件夹结构 我正在考虑这样存储数据: CREATE TABLE folder ( ID INT IDENTITY PRIMARY KEY, FolderName NVARC

我有一个简单的问题-SQL表设计中是否有存储“非此即彼”数据的最佳实践

我有以下问题-我需要在SQL表中存储模板数据(定义文件夹结构)。任何给定的文件夹都可能有一个静态名称(例如“Emails”),也可能是为每个实例动态生成的,具体取决于与其关联的对象(例如公司名称)

实例化业务对象时,模板数据将用于创建实际的文件夹结构

我正在考虑这样存储数据:

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 ) 创建表文件夹 ( ID INT标识主键, FolderName NVARCHAR(50), IsDynamic位不为空默认值为0, dynamicField不包含外键引用dynamicField, ParentID INT外键引用文件夹 ) 因此,如果IsDynamic字段设置为true,我知道将有一个规则(在外键上定义),但如果不是,我将使用存储在文件夹名称中的值


然而,这对我来说似乎有点混乱——这种情况下有“最佳实践”模式吗?

这在我看来并不太糟糕

你可能想考虑不要打扰“iSimple”字段,因为这可以从动态字段为空的事实中得到。然后在SQL中,您可以离开连接并合并动态表中的字段


但是我不认为上面的模型有那么凌乱。

我不确定我是否完全理解了这个问题,但我想你所说的是,你有一个字段,可以有一个静态值,也可以有一个需要在运行时根据其他值确定的值

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)
)
我将创建您自己的“变量”方案并将其存储在数据库中。我不知道你用的是什么语言,所以我会根据这一点提出一些建议(使之不同于你的语言),我会使用一些围绕价值的东西——开始和结束。例如:

值:/companyA/projectA/

value/@companyVariable@/@projectVariable@/


然后只需编写一个例程,查找开始和结束@符号,并用适当的值替换它们。这是一个多一点的工作,但我认为这将是最容易理解的最后和最灵活的。再次强调,@signs正是我首先想到的,使用对您最有意义的任何字符。

您可以在
dynamicfielddid
中使用
NULL
,并进行如下查询:

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

嗨,帕特里克,谢谢你。我在考虑这个问题,但在决定这是比我的情况更好还是更糟时,我犹豫了。你对这为什么更好(或者你认为是利弊)有什么看法?如果你有超过两种类型的文件夹,或者超过两列的影响,这种方法可能会比试图把所有东西放在一个表中更干净。然而,就目前情况而言,我认为克里斯的科莱建议更为实际。我会接受他的回答。:-)有人愿意评论我为什么被否决吗?我的回答在某种程度上是错误的吗?如果这是一个坏主意,请说明原因?