我有一个显示表格信息并允许用户输入和编辑的应用程序。我一直在为此进行数据库设计,并遇到了以下问题。
我想避免为应用程序中的每个表创建一个 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 中完成此操作?
最佳答案
您的问题的解决方案是不对表中的元数据进行编码,而是创建实际的表,即使这样做不方便或需要大量工作。
一些很快就会咬你的东西:
- 没有关系可以建模
- 无法索引
- 没有输入验证(是日期、整数还是图像?)
- 无法获得实际准确的统计数据
- 您编写的每一个查询都将是一场噩梦
在未来为自己节省大量时间和精力,现在就在设计阶段制作实际的表格。 This type of meta-data "god table" has been tried repeatedly and never works.
话虽这么说,如果您表示的是一组非常有限的数据(如您所说,仅针对文件),我会考虑使用坐标系。
保持你的 MyAppTable
不变。
创建一个包含字段的 MyAppFile
表:
- FileId (int identity)
MyAppTableId
(FK)数据
(varbinary)XPos
(int)YPos
(int)
对 (MyAppTableId, Xpos, Ypos)
有唯一约束。
这更准确地表示您要存储的内容,更易于维护,并允许您强制执行完整性。
关于sql-server - 如何在 MSSQL 中表示应用程序中的行和列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13278514/