如何在MSSQL中的应用程序中表示行和列?

Mic*_*ray 3 sql-server constraints sql-server-2012

我有一个显示表格信息的应用程序,允许用户输入和编辑它.我一直致力于数据库设计,并遇到了以下问题.

我想避免为应用程序中的每个表创建一个MSSQL表,所以我一直试图在两个表中一起表示所有表.

我已经定义了一个MyAppTable具有Id INTEGER主键和Name CHARACTER VARYING(255)列的表.

从那里,我已经定义了一个MyAppColumn表,该表对MyAppTable.Id列进行了外键,并且还有一个Position INTEGER列来指示它在渲染表中的位置.

最后,我已经定义了一个MyAppRow表,该表对着MyAppColumn.Id列有外键并且有一Data BINARY(32)列.它是一个小文件表,所以这种数据类型是合适的.

实际问题是我不能保证MyAppColumn.Position列对每个列都是唯一的MyAppTable.

正常情况的一个例子:

  • MyAppTableId0
  • MyAppColumnId0,TableId0,Position0
  • MyAppColumnId1,TableId0,Position1
  • MyAppRowColumnId0,Data[东西]
  • MyAppRowColumnId1,Data[东西]
  • MyAppTableId1
  • MyAppColumnId2,TableId1,Position0
  • MyAppRowColumnId2,Data[东西]

我希望在数据库中无法实现的情况示例:

  • MyAppTableId0
  • MyAppColumnId0,TableId0,Position0
  • MyAppColumnId1,TableId0,Position0

如您所见,我想要一些约束一对列的方法.两列TableId,并PositionUNIQUE但如果是独立完成的,这将意味着两个表可以永远都在有列Position的0.

如何在Microsoft SQL Server 2012中完成此操作?

JNK*_*JNK 6

您的问题的解决方案是不对表中的元数据进行编码,而是创建实际的表,即使它不方便或需要大量工作.

有些东西很快会咬你的后方:

  • 没有任何关系可以建模
  • 无法索引
  • 没有输入验证(是日期,int还是图像?)
  • 无法获得实际的准确统计数据
  • 您编写的每个查询都将成为一场噩梦

在将来节省大量的时间和精力,现在只需在设计阶段制作实际表格. 这种类型的元数据"神表"已经反复尝试过,从不起作用.

话虽这么说,如果你代表一组非常有限的数据(就像你说的那样,仅限于文件),我会考虑一个坐标系.

保持MyAppTable原样.

创建一个MyAppFile包含字段的表:

  • FileId(int identity)
  • MyAppTableId (FK)
  • Data (VARBINARY)
  • XPos (INT)
  • YPos (INT)

有一个独特的约束(MyAppTableId, Xpos, Ypos).

这更准确地表示您要存储的内容,更易于维护,并允许您强制执行完整性.