1

作为我们当前数据库工作的一部分,我们正在研究处理更新数据库的过程。

反复提到的一点是处理系统与用户价值的问题;在我们的项目中,用户和系统 vals 存储在一起。例如...

我们有一个模板列表。

1, <system template>

2, <system template>

3, <system template>

这些在应用程序中映射到枚举 (1, 2, 3)

然后一个用户进来并添加......

4, <user template>

...和...

5, <user template>

然后......我们发出升级......并作为升级脚本的一部分插入......

<new id> [6], <new system template>

那么!!...我们在新的系统模板中发现了一个错误,需要对其进行更新...问题是怎么回事?我们无法使用 ID6 更新记录(因为我们可能已将其插入为 9 或 999,因此我们必须使用其他机制来识别记录)

因此,我们为此提出了两种可能的解决方案。

在红角(速度)....

我们只需从 5000(或其他值)开始用户 ID,并在 10000(或其他值)处测试数据。这将允许我们对系统值进行修改并测试它们直到下一个 ID 范围的下限。

优势...快速且易于实施,

缺点...如果我们不选择足够大的范围,可能会用完值!

在蓝色角落(可扩展性)......

我们分别存储、系统和用户数据,使用 GUID 作为 Id,并使用视图合并两个列表。

优势...可扩展...对数据库大小没有限制。

缺点..实现起来比较复杂。(多对一可更新视图等)


我对第一个选项非常满意,但正在寻找一些弹药来支持我!

有没有人对这些方法有任何想法,甚至是我们错过的方法?

4

6 回答 6

1

我建议使用第二个修改,将系统和用户值存储在一个表中。GUID 以这种方式非常可靠。

另一个想法:使用任何基于文本的 ID(不是必需的 GUID),它是您为系统值提供的,由随机字符串或基于用户值的某种自定义逻辑的字符串生成。

另一个想法:使用第一种方法,但使用一个标志扩展表,该标志显示一个值是系统还是用户。也许这是最简单的。好的,您必须编写某种机制来更新正确的系统值,但这很容易完成。

于 2008-08-13T12:36:21.193 回答
1

Biri 基于文本的 ID +1 - 定义一个“template_mnemonic”基于文本的列并使其成为主键。当您将其插入时,这将是一个已知值,开发人员将决定使用它(或自动生成它),并且无论有多少用户指定的模板,您将始终能够通过其助记符引用模板。它还允许用户对其模板有一个有意义的命名约定。

于 2008-08-13T12:51:41.067 回答
1

我从未遇到过使用 GUID 作为数据库 ID 的问题(性能或开发 - 包括 TDD 和单元测试),而且我已经处理了一些相当大的问题。如果您想了解更多关于使用 GUID(以及可能涉及的 GOTCHAS)作为主键的信息,请查看此处此处此处- 但我不能高度推荐它,因为安全地移动数据和数据库同步变得如此简单就像早上刷牙一样:-)

对于您上面的问题,我会推荐第三列(如果可能的话),指示模板是基于用户还是基于系统,或者您至少可以在插入系统模板时为系统模板生成 GUID 并保留一个列表那些手头的,所以如果您需要更新模板,您可以在您的 DEV、UAT 和/或 PRODUCTION 数据库中定位相同的 GUID,而不必担心覆盖其他模板。尽管可以随意选择所有系统或用户模板,但第三列会派上用场,而无需将它们分成两个表(恕我直言,这是矫枉过正)。

我希望这会有所帮助,

抢G

于 2008-08-13T14:06:58.013 回答
0

也许我没听懂,但是您不能将 GUID 用作 Id 并且仍然将用户和系统数据放在一起吗?然后,您可以通过(不可更改的)GUID 访问系统数据。

于 2008-08-13T12:30:47.867 回答
0

我不认为 GUID 应该有任何问题。

如果你想避免它,那么使用一个标志:

身份证号码

模板随便

标志枚举/int/bool

标志显示实际值是系统值还是用户值。

如果您想更新系统值,则仅询问按 ID 排序的系统值,它会显示实际的插入顺序(您应该有一个 bigint 或 ID 以确保它不会被填满,并且它不会让已删除的 ID 恢复工作)。有了这个列表,x。记录是 x。插入的系统值。

于 2008-08-13T12:47:39.407 回答
0

我认为有更好的第三种解决方案。让我感到震惊的是,您将两个不同的东西存储在同一个表中,并且您最好创建两个单独的表,一个用于用户模板,一个用于系统模板。然后,您可能能够在这两个表上创建一个视图,以使它们在您的应用程序中显示为单个对象。显然我不完全了解您的应用程序,这对您来说可能是不可能的,但我认为这是一个比 GUID 更简洁的解决方案,并且比 ID 范围更安全(真的不要做 ID 范围它会有一天咬你)

于 2008-08-18T14:08:13.550 回答