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

标签 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 的列都是唯一的.

一个正常情况的例子:

  • MyAppTableId 0
  • MyAppColumnId 0, TableId 0, Position 0
  • MyAppColumnId 1、TableId 0, Position 1
  • MyAppRowColumnId 0, Data [某事]
  • MyAppRowColumnId 1、Data [某事]
  • MyAppTableId 1
  • MyAppColumnId 2、TableId 1、Position 0
  • MyAppRowColumnId 2、Data [某事]

我想在数据库中使不可能的情况示例:

  • MyAppTableId 0
  • MyAppColumnId 0, TableId 0, Position 0
  • MyAppColumnId 1、TableId 0, Position 0

如您所见,我想要一些方法来约束一对列。两列TableIdPosition应该是 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/

相关文章:

algorithm - 安排面试算法以尽量减少面试中的申请人数

c# - Web 引用中断 SSIS 包

tsql - 从一列中提取分层数据

sql-server - SQL Server 2012 过滤索引 - Where 子句是否太复杂

sql-server - ADODB.记录集 : Operation is not allowed when the object is closed

c# - 如何查询查询结果集中所有字段的内容?

sql - 在 TSQL 中检查两个日期时间是否在同一日历日的好方法是什么?

sql - 分区边界 ID(例如 sys.partition_range_values 中)是否保证按分区范围排序?

mysql - 删除所有表后恢复数据库时,InnoDB 提示外键名称正在使用

sql-server - 主键、唯一键和外键约束与索引之间有什么区别?