我有一个显示表格信息的应用程序,允许用户输入和编辑它。我一直致力于数据库设计,并遇到了以下问题。
我想避免为应用程序中的每个表创建一个MSSQL表,所以我一直试图在两个表中一起表示所有表。
我已经定义了一个MyAppTable
表,其中包含Id INTEGER
主键和Name CHARACTER VARYING(255)
列。
从那里开始,我已经定义了一个MyAppColumn
表,其中的外键与MyAppTable.Id
列相对应,并且还有一个Position INTEGER
列来表示它在渲染表中的位置。
最后,我已经定义了一个MyAppRow
表,其中包含MyAppColumn.Id
列的外键并且具有Data BINARY(32)
列。它是一个小文件表,所以这种数据类型是合适的。
实际问题是,我无法保证MyAppColumn.Position
列对每个MyAppTable
都是唯一的。
正常情况的一个例子:
MyAppTable
Id
0 MyAppColumn
Id
0,TableId
0,Position
0 MyAppColumn
Id
1,TableId
0,Position
1 MyAppRow
ColumnId
0,Data
[某事] MyAppRow
与ColumnId
1,Data
[某事物] MyAppTable
Id
1 MyAppColumn
Id
2,TableId
1,Position
0 MyAppRow
ColumnId
2,Data
[某事] 我希望在数据库中无法实现的情况示例:
MyAppTable
Id
0 MyAppColumn
Id
0,TableId
0,Position
0 MyAppColumn
Id
1,TableId
0,Position
0 如您所见,我想要一些约束一对列的方法。两列TableId
和Position
应为UNIQUE
,但如果这些列是独立完成的,则意味着两个表在Position
为0时永远不会有列。
如何在Microsoft SQL Server 2012中完成此操作?
答案 0 :(得分:6)
您的问题的解决方案是不对表中的元数据进行编码,而是创建实际的表,即使它不方便或需要大量工作。
有些东西会很快咬住你的后方:
为将来节省大量时间和精力,现在只需在设计阶段制作实际表格。 This type of meta-data "god table" has been tried repeatedly and never works.
话虽如此,如果你代表一组非常有限的数据(就像你说的那样,只针对文件),我会考虑一个坐标系。
按原样保留MyAppTable
。
使用字段创建MyAppFile
表:
MyAppTableId
(FK)Data
(varbinary)XPos
(int)YPos
(int) (MyAppTableId, Xpos, Ypos)
上有一个唯一约束。
这更准确地表示您要存储的内容,更易于维护,并允许您强制执行完整性。