我已经开始了一个新的项目,他们有一个非常规范化的数据库。一切可以查找存储为外键查找表。这是归一化和精细,但我最终做5表连接的最简单的查询。

    from va in VehicleActions
    join vat in VehicleActionTypes on va.VehicleActionTypeId equals vat.VehicleActionTypeId
    join ai in ActivityInvolvements on va.VehicleActionId equals ai.VehicleActionId
    join a in Agencies on va.AgencyId equals a.AgencyId
    join vd in VehicleDescriptions on ai.VehicleDescriptionId equals vd.VehicleDescriptionId
    join s in States on vd.LicensePlateStateId equals s.StateId
    where va.CreatedDate > DateTime.Now.AddHours(-DateTime.Now.Hour)
    select new {va.VehicleActionId,a.AgencyCode,vat.Description,vat.Code,
vd.LicensePlateNumber,LPNState = s.Code,va.LatestDateTime,va.CreatedDate}

我想建议,我们denormaize一些东西。像的状态的代码。我没有看到状态代码在我的一生改变。类似的故事与3个字母的机构代码。这些是由机构代理发放,并不会改变。

当我走近DBA与国家代码的问题和5表连接。我得到的是“我们是归”和“连接是快”的响应。

是否有令人信服的理由非规范化?我愿意做它的理智,如果没有别的。

在T-SQL相同的查询:

    SELECT VehicleAction.VehicleActionID
      , Agency.AgencyCode AS ActionAgency
      , VehicleActionType.Description
      , VehicleDescription.LicensePlateNumber
      , State.Code AS LPNState
      , VehicleAction.LatestDateTime AS ActionLatestDateTime
      , VehicleAction.CreatedDate
FROM VehicleAction INNER JOIN
     VehicleActionType ON VehicleAction.VehicleActionTypeId = VehicleActionType.VehicleActionTypeId INNER JOIN
     ActivityInvolvement ON VehicleAction.VehicleActionId = ActivityInvolvement.VehicleActionId INNER JOIN
     Agency ON VehicleAction.AgencyId = Agency.AgencyId INNER JOIN
     VehicleDescription ON ActivityInvolvement.VehicleDescriptionId = VehicleDescription.VehicleDescriptionId INNER JOIN
     State ON VehicleDescription.LicensePlateStateId = State.StateId
Where VehicleAction.CreatedDate >= floor(cast(getdate() as float))
有帮助吗?

解决方案

我不知道是否我甚至会打电话给你想要做什么,非规范化 - 它看起来更像你只是想代替人工外键(STATEID,AgencyId)具有天然的外键(州的缩写,机构代码)。使用VARCHAR字段,而不是整场将放慢加入/查询性能,但(a)如果你甚至都不需要加入表的大部分时间,因为自然的FK是你想要什么反正这不是什么大不了( b)你的数据库将需要相当大的/有一个高负荷为它是显着的。

但DJNA是在你需要的当前和未来的需求做出这样的改变之前,一个完整的理解是否正确。你确定这三个字母的代码机构永远不会改变,从现在甚至五十年?真的,真的确定吗?

其他提示

可以需要的性能(和神智)在某些时间的原因的一些非规范化。很难说wihout看到所有的表/需求等等...

但是,为什么不只是建立了几个方便的意见(做了几个连接),然后使用这些能够编写简单的查询?

当心想要形状的东西到当前成语。眼下不熟悉的代码似乎unweildy和阻塞你的理解。随着时间的推移它可能是你将成为适应的。

如果当前(或将来已知的)的要求,诸如性能没有得到满足那么这是一个完全不同的问题。但要记住什么都可以了性能优化,目的不是让事情尽可能快的,但让他们速度不够快。

这以前的帖子查处了类似的问题,你遇到的一个。希望这将有助于你。

用 “hypernormalized” 数据处理

我个人采取的正常化正常化尽可能的,但去正规化只为性能。和EVN性能的非正规化的东西,以避免。我会去剖析的途径,制定正确的索引,等等之前,我想非规范化。

理智...这是高估了。尤其是在我们的职业。

嗯,差不多的性能呢?如果性能是好的,只是让五个表连接到一个视图,并为理智,从视图中选择,当你需要的数据。

国家缩写,其中我认为有意义的按键都还好的案例之一。对于行的数量有限,而且在那里我的数据的完全控制我(这意味着它不是来自外界的一些填充源)很简单的查找表,我有时会创建有意义的四个五个字符键,以便键值可以代理在某些查询的完全描述性的查找值。

创建视图(或内联表值函数来获取参数化)。在任何情况下,我通常把我所有的代码转换成的SP(产生了一些代码)是否使用视图与否,就是这样,你很可能永远只能写一次参加

这是自变量(对于这种“正常化”),这三个字母的代码可能会改变也不是没有,如果代码做出改变,你会做什么,和你的人工键的情况将如何应对这一突发事件计划非常引人注目比使用代码作为密钥更好。除非你已经实现了一个完整时间模式(这是可怕很难做到的,而不是由你的榜样建议),这不是明显对我怎么样你正常化的好处你的。现在,如果你有多个来源和标准机构认为有可能发生碰撞的代码名称的工作,或者如果“状态”可能最终意味着对国家,省,部,广州两个字母的代码,或ESTADO,那又另当别论。然后,您需要自己的钥匙,或者您需要使用比代码的更多信息两列键。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top