Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在SQL Server 2012数据库中添加对特定于计算机的查找的支持_C++_Sql_Sql Server_Database Design_C++builder - Fatal编程技术网

C++ 在SQL Server 2012数据库中添加对特定于计算机的查找的支持

C++ 在SQL Server 2012数据库中添加对特定于计算机的查找的支持,c++,sql,sql-server,database-design,c++builder,C++,Sql,Sql Server,Database Design,C++builder,我必须维护一个带有SQL Server 2012后端的应用程序。 有一个数据库表,其中包含一组 机器参数设置,每列一个。 每个参数都是一个nchar(15)类型引用 依赖于类型的查找表,例如 CREATE TABLE L_MachineSettings ( ID uniqueidentifier NOT NULL PRIMARY KEY, ParentID uniqueidentifier, IsActive nchar(15) FOREIGN KEY REFERENCE

我必须维护一个带有SQL Server 2012后端的应用程序。 有一个数据库表,其中包含一组 机器参数设置,每列一个。 每个参数都是一个nchar(15)类型引用 依赖于类型的查找表,例如

CREATE TABLE L_MachineSettings (
    ID uniqueidentifier NOT NULL PRIMARY KEY,
    ParentID uniqueidentifier,
    IsActive nchar(15) FOREIGN KEY REFERENCES L_YesNo(Constant),
    OnTime nchar(15) FOREIGN KEY REFERENCES L_Time(Constant),
    Motor1_InitMode nchar(15) FOREIGN KEY REFERENCES L_InitModes(Constant),
    ...
    and so on (nearly 60 parameters are following, some are ref. the same lookup-tables)
    ...
)
每个查找表的构建方式如下所示:

CREATE TABLE L_Lookup_YesNo (
    Constant nchar(15) PRIMARY KEY,
    TargetValue nvarchar(max),
    NotSupportedBy nvarchar(max)
)

INSERT INTO L_Lookup_YesNo
    (Constant, TargetValue)
VALUES
    (N'No',  N'0'),
    (N'Yes', N'1')
有几种不同的机器类型,其中有些没有能力 由于硬件规格有限,无法接受所有查找表的所有值。 对于这些,查找表中的NotSupportedBy字段填充了未支持的机器类型 支持用分号分隔的值,例如

INSERT INTO L_Lookup_InitModes
    (Constant, TargetValue, NotSupportedBy)
VALUES
    (N'Standard',     N'144A', NULL),
    (N'Extended,      N'144B', NULL),
    (N'ExtendedPlus'  N'144Z', N'AU1220;AU1221'),
    (N'ExtendedPlusB' N'144D', N'AU1220;AU1221;AU1401')
机器类型本身在单独的表格中定义:

CREATE TABLE L_MTypes (
    Name nchar(6) PRIMARY KEY,
    Comment nvarchar(max)
)

INSERT INTO L_MTypes
    (Name, Comment)
VALUES
    (N'AU1220', N'Basic Edition'),
    ...
仅允许部分实现L_MachineSettings行 因此它可以包含空值,只要它是ParentID 属性已设置为包含缺少的 参数。 此外,子行值将覆盖父行的值, 因此,可以通过创建基本设置来构建层次参数结构 以及在引用时仅为新设置添加不同的值 所有其他值。如果要更改基准值,则“通过”更改为 它是自动生成的,所以XML文件代表最终的格式 其中,发送给客户的数据始终包含所有最近的更改

我现在面临的挑战是如何生成那些列查找值 特定于机器的,同时不抛出现有的数据库布局 在堆上。 所以我需要的是一种将多个查找值存储到设置字段中的方法, 它将与机器类型关联。如果没有特定机器的特定值 类型可用,导出时应使用常规值。机器特定值 也应该从查找表中获取。 一件重要的事情是:在GUI(用C++Builder编写)旁边,一些用户也是 通过MS Access访问SQL Server DB,这些用户不是数据库方面的合格人员(您知道 我的意思是),所以现有的结构应该只有微小的变化

到目前为止,我的想法是:

  • 将新列MType添加到L_MachineSettings以将特定于计算机的选项添加到ParentID设置
  • 通过分号分隔向字段添加特定于机器的值,例如“是;AU1220:否”
虽然第一个想法一开始似乎很简单,但我担心与ParentID内容的冲突以及可能导致的混乱。 第二种方法将放弃现有的查找关系(直到现在才使用列不支持的查找表来打破这种关系),因此我不接受这种更改


在这里,谁能为我提供一些最佳实践?

在一个元组中存储多个值是一个可怕的想法。它违反1NF,只会引起疼痛。不要像这样存储分隔值。你必须不断地把它们分解成可用的表格格式,这样你就可以操纵数据,然后再把它们重新组合在一起。任何地方存储一个分隔列表,都可以考虑(1)将它分解成新表中的新字段。(如果分隔列表中的值不具有同一概念的多个值,即电话号码,则这是正确的)或(2)添加链接到原始表的新表。根据多部分列表中定义的内容,您可能必须同时执行这两项操作。这是处理此问题的正确方法。注意:如果您不能修改基表,也可以将其他表用于案例(1)。