计算列从基于当前表值的另一个表列获取值

时间:2017-02-19 14:31:03

标签: sql-server

今天的问题更多的是,是否有可能,我确信这是可能的,由于我缺乏知识和经验,我可能只是不知道正确的语法。我在网上搜索过,但是像往常一样找不到适用于回答我问题的相关例子。

所以我有四张桌子。

一个名为Type。 一个叫SubType。 一个叫做模型。

最后是资产。资产应该存储上述每个的ID。但是,我正在考虑自动化如何计算Type和SubType。根据特定模型存储类型和子类型值。

所以,如果我在资产中引用模型的ID。 有没有办法使用计算列从Model表中获取Type和SubType的值,并在Asset中自动计算它。 我正在考虑删除用户手动管理这些值的需要。

到目前为止,这是我的代码,正如您将在资产表中看到的那样,我目前只使用外键和ID。任何建议和帮助表示赞赏!

CREATE TABLE AssetType
(
AssetTypeID TINYINT NOT NULL,
CONSTRAINT AssetTypeID PRIMARY KEY (AssetTypeID),
AssetTypeTitle VARCHAR(255) NOT NULL CONSTRAINT AssetTypeTitleUniqueConstraint UNIQUE
)

CREATE TABLE AssetSubType
(
AssetSubTypeID TINYINT NOT NULL,
CONSTRAINT AssetSubTypeID PRIMARY KEY (AssetSubTypeID),
AssetSubTypeTitle VARCHAR(255) NOT NULL CONSTRAINT AssetSubTypeTitleUniqueConstraint UNIQUE,
AssetSubTypeAssetTypeID TINYINT NOT NULL,
CONSTRAINT AssetSubTypeAssetTypeID FOREIGN KEY (AssetSubTypeAssetTypeID) REFERENCES AssetType(AssetTypeID)
)

CREATE TABLE Model
(
ModelID UNIQUEIDENTIFIER CONSTRAINT ModelIDDefault DEFAULT NEWSEQUENTIALID() NOT NULL,
CONSTRAINT ModelID PRIMARY KEY (ModelID),
ModelTitle VARCHAR(255) NOT NULL,
ModelManufacturerID UNIQUEIDENTIFIER NOT NULL,
CONSTRAINT ModelManufacturerID FOREIGN KEY (ModelManufacturerID) REFERENCES Manufacturer(ManufacturerID),
ModelOrganisationID UNIQUEIDENTIFIER NOT NULL,
CONSTRAINT ModelOrganisationID FOREIGN KEY (ModelOrganisationID) REFERENCES Organisation(OrganisationID),
CONSTRAINT ManufacturerUnique UNIQUE (ModelTitle, ModelManufacturerID, ModelOrganisationID),
ModelAssetTypeID TINYINT NOT NULL,
CONSTRAINT ModelAssetTypeID FOREIGN KEY (ModelAssetTypeID) REFERENCES AssetType(AssetTypeID),
ModelAssetSubTypeID TINYINT NOT NULL,
CONSTRAINT ModelAssetSubTypeID FOREIGN KEY (ModelAssetSubTypeID) REFERENCES AssetSubType(AssetSubTypeID),
ModelCITypeID TINYINT NOT NULL,
CONSTRAINT ModelCITypeID FOREIGN KEY (ModelCITypeID) REFERENCES CIType(CITypeID),
ModelCISubTypeID TINYINT NOT NULL,
CONSTRAINT ModelCISubTypeID FOREIGN KEY (ModelCISubTypeID) REFERENCES CISubType(CISubTypeID)
)

CREATE TABLE HardwareAsset
(
HardwareAssetID UNIQUEIDENTIFIER CONSTRAINT HardwareAssetIDDefault DEFAULT NEWSEQUENTIALID() NOT NULL,
CONSTRAINT HardwareAssetID PRIMARY KEY (HardwareAssetID),
HardwareAssetTitle VARCHAR(255) NOT NULL,
HardwareAssetAssetStatusID TINYINT NOT NULL,
CONSTRAINT HardwareAssetAssetStatusID FOREIGN KEY (HardwareAssetAssetStatusID) REFERENCES AssetStatus(AssetStatusID),
HardwareAssetAssetTypeID TINYINT NOT NULL,
CONSTRAINT HardwareAssetAssetTypeID FOREIGN KEY (HardwareAssetAssetTypeID) REFERENCES AssetType(AssetTypeID),
HardwareAssetAssetSubTypeID TINYINT NOT NULL,
CONSTRAINT HardwareAssetAssetSubTypeID FOREIGN KEY (HardwareAssetAssetSubTypeID) REFERENCES AssetSubType(AssetSubTypeID),
HardwareAssetAssetTag VARCHAR(255) NOT NULL CONSTRAINT HardwareAssetAssetTagUnique UNIQUE,
HardwareAssetSerialNumber VARCHAR(255) NOT NULL CONSTRAINT HardwareAssetSerialNumber UNIQUE,
HardwareAssetManufacturerID UNIQUEIDENTIFIER NOT NULL,
CONSTRAINT HardwareAssetManufacturerID FOREIGN KEY (HardwareAssetManufacturerID) REFERENCES Manufacturer(ManufacturerID),
HardwareAssetModelID UNIQUEIDENTIFIER NOT NULL,
CONSTRAINT HardwareAssetModelID FOREIGN KEY (HardwareAssetModelID) REFERENCES Model(ModelID),
)

2 个答案:

答案 0 :(得分:1)

在我看来,最好的做法是,只要在Model.TypeIdModel.SubTypeId之间使用inner join查询HardwareAssetModel,你需要这些价值观。

如果您坚持让Model.TypeId表中的Model.SubTypeIdHardwareAsset包含计算列:

  • 您需要使用获取Model.TypeId的标量函数调用和获得给定Model.SubTypeId的{​​{1}}的单独标量函数。

  • 这些计算列正在引用另一个表,因此它们将是ModelId。 您可以索引non-deterministic计算列。 这意味着每次尝试检查这些值时,您将在non-deterministic中每行调用两个标量函数。那很快就会很慢。

如果您坚持在HardwareAsset表格中存储Model.TypeIdModel.SubTypeId,则另一种方法是每次提取HardwareAssetModel.TypeId插入或更新Model.SubTypeId表中的行。无论您如何实现它,它仍然违反了数据库规范化的规则之一。

最后一种选择,使用视图:

HardwareAsset

答案 1 :(得分:1)

为什么要将此值存储在两个位置?它可以从Model表中访问。就此而言,子类型也是如此。在子表中复制这些数据值会违反规范化,允许不良代码创建不一致的值,并创建您尝试解决的非问题。只需让任何客户端代码通过执行到父表的连接来查找它。

如果您真的希望数据库工件包含来自多个表的数据,请在展平结构中创建一个view(使用连接),它包含您想要的所有表列,并拥有客户端SQL代码请改用该视图。