2017-02-19 36 views
1

今天的问题更多地是一个,是否可能,我确定它是这样,我可能只是不知道正确的语法,因为我缺乏知识和经验。我浏览过网页,但像往常一样无法找到适用于回答我的问题的相关示例。计算列从另一个表中获取值基于当前表格的列值

所以我有四张桌子。

一个叫做Type。 一个叫做SubType。 一个叫做Model。

最后资产。资产应该存储上述每个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), 
) 
+0

代码是不完整的,我想,例如,'Model.ModelAssetTypeID'在哪里? –

+0

你的'HardwareAsset.HardwareAssetAssetTypeId'会不同于'Model.ModelAssetTypeId'吗? – SqlZim

+0

是在那里: ModelAssetTypeID TINYINT NOT NULL, 约束ModelAssetTypeID外键(ModelAssetTypeID)参考文献AssetType(AssetTypeID), – TheTechnicalPaladin

回答

1

一个最后的选择,使用一个看法?它将从Model表格中访问。对于这个问题,子类型也是如此。在子表中复制这些数据值违反了规范化,允许错误的代码创建不一致的值,并创建您尝试解决的非问题。只要有任何客户端代码通过执行到父表的连接来查看它。

如果您真的希望数据库工件包含多个表中的数据,请使用连接创建一个view(使用连接),该连接具有所有需要的表列,并且使用客户端SQL代码使用该视图代替。

+0

说实话,我甚至没有考虑到这将是更简单的通过JOIN得到这个,作为一个完整的表只是认为这是一个很好的存放地点,感谢您的帮助 – TheTechnicalPaladin

1

最好的行动当然,在我看来,是简单地查询Model.TypeIdModel.SubTypeId使用和Modelinner join之间HardwareAsset时,你需要这些值。

如果你坚持有在HardwareAssetModel.TypeIdModel.SubTypeId与计算列:

  • 你需要一个标量函数调用获取Model.TypeId,并且获得一个单独的标量函数做对于给定的ModelIdModel.SubTypeId

  • 这些计算列引用了另一个表,因此它们将是non-deterministic。 您可以不是索引non-deterministic计算列。 这意味着每次尝试检查这些值时,您都会在HardwareAsset的每行中调用两个标量函数。这会很快变得非常缓慢。

一个选择,如果你坚持存储Model.TypeIdModel.SubTypeIdHardwareAsset表将是Model.TypeIdModel.SubTypeIdHardwareAsset表中的行插入或更新,每次在拉。不管你如何实现它,它仍然违反了数据库规范化的一个规则。你为什么要存储在两个地方该值

go 
create view dbo.HardwareAsset_with_ModelInfo as 
select 
    HardwareAssetId 
    , HardwareAssetTitle 
    , HardwareAssetAssetStatusId 
    , HardwareAssetAssetTypeId = m.ModelAssetTypeID 
    , HardwareAssetAssetSubTypeId = m.ModelAssetSubTypeID 
    , HardwareAssetAssetTag 
    , HardwareAssetSerialNumber 
    , HardwareAssetManufacturerId = m.ModelManufacturerId 
    , HardwareAssetModelId 
from HardwareAsset as ha 
    inner join Model as m 
    on ha.HardwareAssetModelId = m.ModelId 
go 
+0

说实话,我甚至认为这将是更简单的,通过一个JOIN和作为一个完整的问题表只是认为这是一个很好的地方存储,感谢您的帮助 – TheTechnicalPaladin

相关问题