数据库列类型前缀

Posted

技术标签:

【中文标题】数据库列类型前缀【英文标题】:Database columns type prefix 【发布时间】:2009-06-15 11:01:58 【问题描述】:

我已经使用数据库开发解决方案超过 11 年了,似乎我已经“形成”了一个关于命名表中的列的颇具争议的观点:我总是给它们一个 3 或 4 个字符的类型前缀,即 intGroupID、nvcTitle、dtmCreated、bitPlayerHater 等。我曾与其他几位完全鄙视老式前缀约定的开发人员一起工作。

(是的,我知道,我没有在这里发明任何东西,我只是拒绝放弃它:)

我的主要理由是在我的开发人员尝试理解数据结构时向他们提供尽可能多的信息。立即了解列的类型可以让您(或至少我)更好地了解您正在处理的内容。与使用 C# 或 VB.NET 相比,当您编写查询时,通常不会从 IDE 获得相同的智能感知支持。

到目前为止,没有人能够提出可以改变我对这个特定主题的想法的杀手级论点。我还有其他一些同样有争议的命名约定来增加清晰度,但列前缀似乎惹恼了更多人。

为什么为数据库列添加前缀被认为是一种不好的做法?

【问题讨论】:

道歉,但这已经被问过了(但不是特定于数据库的)。这个问题的一些答案非常好,应该向你展示 - 在我看来 - 你的方式的错误:) ***.com/questions/111933/… 【参考方案1】:

它被称为“Hungarian Notation”。

作为一名开发人员(和数据架构师),我发现它毫无价值。它没有提供太多信息。

    它仅对部分类型信息提供快速、不准确的注释。例如,它省略了长度。

    在对象是 BLOB 的更复杂的数据库环境中,它根本不提供有关 Blob 中对象类型的信息。

    更改数据类型很痛苦。

    有必要记住一个晦涩的前缀。是vcNamestrName还是uniName

    SQL 自动处理类型转换,使得繁琐的特定类型命名在很大程度上无关紧要。

    最重要的是:它没有提供关于数据含义的有用文档。我的经验是,人们几乎总是会破坏意义。他们很少(如果有的话)对它是 int 还是 string 感到困惑。当他们想知道时,他们只需使用 TOAD 或其他提供 ACTUAL 类型的工具来描述表格,而不是预期类型的​​部分摘要。

[虽然说它几乎没用,但我意识到这可能不是您要寻找的“杀手锏”。如果您可以逐点更新您的问题,这将有所帮助,您认为这是匈牙利符号的价值,因此可以逐点解决。]

【讨论】:

【参考方案2】:

我已经更改了几次列类型。例如从numberstringcode。在大多数情况下,如果没有前缀,我可以在不重新编码的情况下做到这一点,并且所有应用程序仍将运行(至少在 oracle 中)。使用您的方法,我需要将 intCode 更改为 strCode,并且我 100% 确定我需要使用此字段重做所有代码!

将整数转换为浮点数也是如此。

有些人还会在列名前加上表格缩写(例如department.dep_code)。我发现这真的很难编码,因为我倾向于忘记缩写。具有 50 个表的系统往往会获得非常相似的前缀。使用它的原因是在将员工加入部门时,部门代码字段是一个唯一字段(emp_codedep_code)。我认为它不会增加价值,因为使用表别名可以更轻松地完成此操作,而不会强制您使用前缀。

我在客户端代码中为 GUI 组件使用了很多前缀。例如。 sle 用于单行编辑,hungarian notation 用于 c 和 powerbuilder。迁移到 java 时,我停止使用它。我想我为变量使用了更清晰的名称。然而转向面向对象的语言是,一切都是对象,在任何地方都使用objVariable 有点傻。

【讨论】:

【参考方案3】:

我不输入列名前缀的最大原因是,当我必须记住(然后输入)列的前缀而不是仅仅输入时,它倾向于使输入查询的过程更长逻辑名称(例如 FirstName 而不是 strFirstName)。

【讨论】:

也许应该是 chrFirstName,因为之前的开发人员假设每个人的名字都会有十个字符长,如果没有,他会将下划线作为填充【参考方案4】:

通常,您或处理您数据的人员应该知道您的数据的基础。由于查询不是真正强制执行的强类型,因此您可以参数化任何查询。您第一次测试查询要么成功,要么失败。修复它,然后继续。

至于在可视化 IDE 中工作,我见过许多不强制使用通用约定命名对象(文本框、组合框等)的商店。由于我以前做过的很多东西都是动态生成、链接、绑定的,所以我在控件上使用了这样的前缀,例如 txtFirstName、btnOk、cboStateList 等。然后,这些控件,我去掉了前 3 个字符并命名为在运行时自动绑定到数据对象的字段(如果适用)。但是,如前所述,表中列名的前缀可能会导致更多问题而不是帮助。

我的美元值(通货膨胀从 2 美分)

【讨论】:

【参考方案5】:

问题在于所谓的 Apps Hungarian Notation 和 Systems Hungarian Notation 之间。前者添加有关您拥有的种类数据的信息(例如,dx 可能表示“距左边框的像素数”),而后者添加有关类型的信息您拥有的数据(例如,bit 表示 bit)。

使用当前的编程环境和方法,您永远不必查找正在使用的变量的类型。如果你错了,IDE 和编译器会告诉你。因此,这本质上是冗余数据,当您开始(自动)从这些名称生成源代码时,它就会开始影响您:

// just looks wrong:
public void SetSomething(bool bitPlayerHater)

阅读 Joel 关于Making Wrong Code Look Wrong 的文章。尤其是“我是匈牙利”部分。

【讨论】:

【参考方案6】:

另外,如果您必须更改数据类型(发生的事情比您想象的要多 - 我们刚刚迁移到 unicode),您必须在整个代码中更改列名。 (顺便说一句,这是一件坏事!):-)

【讨论】:

【参考方案7】:

根据我的经验,数据库系统非常擅长执行操作的类型安全,因此几乎不需要这样的前缀。我的数据库理想主义者说系统无论如何都应该基于域(抽象数据类型),因此就与不同运算符的兼容性而言,低级数据类型基本上是无关紧要的。

系统实施后,任何需要了解列类型的人都可以轻松查询数据字典/系统目录以查找此信息。在建模阶段,这些类型通常也可以作为规范的一部分随时使用。

不使用前缀的一个很好的理由是:它会使按标识符排序的数据字典上执行查询变得困难,因为标识符的前导部分现在实际上是类型。在我看来,类型是与标识符不同的属性,因此应该单独存储。

【讨论】:

【参考方案8】:

我正要说我在一个名为匈牙利语的数据库上工作了多年...基本上还可以,但多年来,一些以数字为前缀的字段实际上包含字母数字,而一些布尔标志则不包含,并且一些 varchars 已经变成了 clob,等等等等......无论如何都足以代表年轻玩家的一个重要陷阱。

我没有也不认为命名约定实际上有任何“错误”...只是有点不灵活,开发人员可以应付...但我同意它增加的价值很小...程序员通常是非常聪明的人,记住数据库模式的数据类型实际上并没有太大的挑战...特别是如果您长时间使用系统。

总而言之,我不赞成使用匈牙利符号,但如果我继承了一个使用它的系统,并创建了新表,我会遵循约定... .

如果他们一直在抱怨,请发给我。我会给他们一些真正让他们生气的东西,比如 Java 程序中的 PascalCase,或者非大写的 CONSTANTS,例如 ;-)

顺便说一句:我还将用于命名控件(和仅控件)的 VB 标准移植到 Java 中,因为它很有意义,并且提供了有用的信息;它广为人知并被广泛使用,即使它违反了 Java 编码标准,它也可以作为一种通用语言。

我对编码标准的看法:

做任何有效的事。 阅读并理解至少一项已发布的标准,但不要教条地遵循它。见第 1 点。 在罗马时...一致性是让它“挂在一起”的关键。见第 1 点。

干杯。基思。

【讨论】:

-1:“做任何有效的事”。务实固然重要,但人们用这个词来颠覆软件的价值。有时,他们的“无论做什么”都没有任何实际意义。必须有更好的表达方式来鼓励实用的编程,这些编程仍然是好的、有意义的、经久不衰的软件。

以上是关于数据库列类型前缀的主要内容,如果未能解决你的问题,请参考以下文章

test

值得收藏:一份非常完整的MySQL规范

MySQL高性能优化规范建议,速度收藏

如何通过Excel中的某个前缀过滤列数据

插入 XML 数据时,将数据记录作为前缀的无效字符(?)到数据库列 [关闭]

MySQL索引介绍