回答

收藏

非标准化处理是为了实现理性或性能?

技术问答 技术问答 277 人阅读 | 0 人回复 | 2023-09-14

我开始了一个新项目,他们有一个非常标准化的数据库。搜索表的外键可以作为搜索内容的所有内容存储。这是标准化的,很好,但我最终连接了五个最简单的查询表。
7 p1 g2 X" J5 f8 p9 K, Y                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}我建议我们标准化一些内容。像州代码一样。% U( g, [' Z7 t! v& E3 W. [
我一生中没有看到状态码的变化。三个字母的代理代码也有类似的故事。这些是由代理分发的,永远不会改变。
6 ]) I! }, v+ x: z) ?& v当我向DBA当提出状态代码问题时,这五个表已经连接起来。我得到了我们标准化和快速连接的回应。
% X$ S8 ^8 o9 u是否有令人信服的论点来规范?如果没有其他原因,我会为了理性而这样做。
. k5 k  t/ d' o& E, ?) `5 L7 {3 P6 kT-SQL同样的查询:
6 `4 U* ~8 R8 d, J                SELECT VehicleAction.VehicleActionID  Agency.AgencyCode AS ActionAgency  VehicleActionType.Description  VehicleDescription.LicensePlateNumber  State.Code AS LPNState  VehicleAction.LatestDateTime AS ActionLatestDateTime  VehicleAction.CreatedDateFROM 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.StateIdWhere VehicleAction.CreatedDate >= floor(cast(getdate() as float))                1 K* M- H! V3 W9 t- G
    解决方案:                                                               
1 U" b: ~( n$ b2 u$ F$ P7 |$ ^                                                                我不知道我什么都不叫你。你必须非标准化-9 Y! k& [/ t/ g0 ]: S2 a
看来你只想用自然外键(状态缩写、代理代码)代替人工外键(StateId,AgencyId)。使用varchar字段而不是整数字段会降低连接/查询的性能,但是(a)如果你大部分时间甚至不需要连接表,因为你想使用自然FK,所以没什么大不了的,而且(
3 r& E8 D, g9 p  R6 w% B) L8 G3 Eb)您的数据库需要相当大/承受高负荷。7 R* h* ?3 {9 v* e
但是djna这是正确的,因为你需要充分了解当前和未来的需求,解当前和未来的需求。你确定三个字母机构的代码即使五年后也不会改变吗?真的,真的可以吗?
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则