Database design 存储系统值的位置

Database design 存储系统值的位置,database-design,oop,Database Design,Oop,这似乎是一个常见的问题,但我找不到。也许“系统价值”是一个错误的短语 总之,我所说的“系统价值”是指系统对给定概念的内置价值。例如,如果我有一个类别列表(例如,墨西哥、美国、意大利等),您会将它们存储在哪里?你会把它们硬编码(可能是一个枚举)还是放入数据库 如果你说硬编码,如果用户可以创建新的类别,你的答案会改变吗?显然,您必须将新的值存储在数据库(或其他媒体,如xml)中,但您是否会将标准系统值硬编码,然后在运行时合并它们?我想您回答了自己的问题 如果在您的项目生命周期中某些东西永远不会改变(

这似乎是一个常见的问题,但我找不到。也许“系统价值”是一个错误的短语

总之,我所说的“系统价值”是指系统对给定概念的内置价值。例如,如果我有一个类别列表(例如,墨西哥、美国、意大利等),您会将它们存储在哪里?你会把它们硬编码(可能是一个枚举)还是放入数据库


如果你说硬编码,如果用户可以创建新的类别,你的答案会改变吗?显然,您必须将新的值存储在数据库(或其他媒体,如xml)中,但您是否会将标准系统值硬编码,然后在运行时合并它们?

我想您回答了自己的问题

如果在您的项目生命周期中某些东西永远不会改变(祝您好运),那么我将使用数组或散列。通常我有一个函数返回它

但通常我会在数据库中存储所有可能更改的内容


如果要区分原始类别和用户提交的类别,请添加默认值为0的列,不要将其设置为“插入”。将原始值设置为1。

如果值列表与应用程序逻辑紧密关联,我通常不会在应用程序中将它们存储为枚举或类似值时遇到问题。无论如何,您都必须使用新逻辑更新应用程序,而将值存储在数据库中只会增加有人在不更新该逻辑的情况下错误添加或删除值的可能性


不过,您给出的示例(“墨西哥”、“美国”、“意大利”)是数据库存储的主要候选对象。此列表可能会频繁更改,应用程序代码中的任何内容都不需要更新以处理新值。如果你决定处理厄尔巴尼安食物,你所需要做的就是更新数据库,你就完成了。如果不需要,没有理由强制应用程序更新。

有些符号值是应用程序的真常量(例如pi值或整数可以表示的最大值)。把它们放到源代码中就可以了

如果预见到用户需要更改这些值,则需要将它们放入外部配置(或数据库)文件中。代码中有些值和配置中有些值令人困惑;对于列表,也可能很难让用户删除他不想要的值

对于配置文件中的值,您仍然希望将其保持在源代码管理下。为此,常见的选项有:

  • 对于配置文件,请在源代码管理中设置配置文件的默认版本
  • 对于SQL数据,可以使用包含SQL命令的文件,也可以使用在源代码管理下创建初始数据库的程序

  • 其他人给出了很好的答案。我只想补充一点,您给出的国籍示例是,您不应该在数据库中将它们编码为枚举,因为它们太可能更改

    仅对保证不会更改的一小部分值使用枚举。也就是说,从集合中添加或删除值在逻辑上是荒谬的。如果您的值集可能会发生更改,请将其存储在查找表中,以便只需使用UPDATE/INSERT/DELETE命令即可更改数据值。重新定义枚举是一种元数据更改,这通常代价高昂

    请注意,如果您认为值列表“可能”不会更改,或“没有理由”更改,或任何其他此类限定规则,则可以假定某些管理者会要求在某个点更改该集


    PS:ENUM是特定于MySQL的数据库类型。其他一些数据库可以通过检查约束实现类似的结果。

    如果用户可以添加、编辑或删除列表中的值,那么显然在应用程序中对它们进行硬编码是不可行的选择。但是,如果用户不控制列表,并且列表相对较短,那么硬编码它们(例如枚举)是一个非常有效的选择,即使它们必须经常更改,只要您有一种机制可以轻松地将客户端应用程序更新到最新版本。这种方法显然比将它们存储在外部数据源中更简单


    但是,我想不出除了在数据选取列表中之外,还有多少其他用途,比如国籍列表,这些数据最终会出现在数据库中,在这种情况下,从数据库中的一个表中提取该列表更有意义,该表通过适当的关系约束绑定到其他表。我继承了多个应用程序,它们在两个位置维护选项列表:数据库表和编译到应用程序中的匹配枚举。这种情况称为“不好”。请将数据放入数据库。没有硬编码

    这些值将发生变化,或者至少会被扩展。如果它们以任何方式与数据相关,请帮自己一个忙,首先将它们放在数据库中。这不仅可以在以后添加其他值时节省时间,还允许它们在数据库级别参与引用完整性约束

    当我看到你文章的标题时,我笑了,因为我的数据库几乎总是包含一个名为SystemValues的表,用于存储配置程序操作的“一次性”值,例如(例如)存储生成的输出的根文件夹。还有一个匹配的存储过程GetSystemValue(Key,ValueIfNull)来检索它们

    对于允许自定义到用户级别的项目,我还包括一个名为UserValues的表,其中包含一个额外的UserID列和一个GetUserValue(Key、UserID、ValueIfNull)存储过程


    对于那些不面向数据库的应用程序,Windows为您提供了一个很好的“免费”数据库—注册表—或者您可以将自己的配置文件放在一起。

    我同意,将它们放在不同的位置可能会很困难