3

我有一个显示表格信息并允许用户输入和编辑它的应用程序。我一直在为此进行数据库设计,并遇到了以下问题。

我想避免为应用程序中的每个表创建一个 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,但如果这是独立完成的,这将意味着两个表永远不会有列都为 0。PositionUNIQUEPosition

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

4

1 回答 1

6

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

一些很快就会在后面咬你的东西:

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

将来为自己节省大量时间和精力,现在就在设计阶段制作实际的表格。 这种类型的元数据“神表”被反复尝试,始终没有奏效。

话虽这么说,如果您代表的数据集非常有限(就像您说的,仅用于文件),我会考虑使用坐标系。

保持MyAppTable原样。

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

  • FileId(整数身份)
  • MyAppTableId(FK)
  • Data(变量二进制)
  • XPos(整数)
  • YPos(整数)

在 上具有唯一约束(MyAppTableId, Xpos, Ypos)

这更准确地代表了您尝试存储的内容,更易于维护,并允许您强制执行完整性。

于 2012-11-07T21:34:38.927 回答