问题标签 [database-design]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
8 回答
13814 浏览

database-design - 存储对需要批准才能可见的数据库记录的更改的最佳方式是什么?

我需要将用户输入的更改存储到特定表中,但在管理员用户查看和批准之前不显示这些更改。虽然这些更改仍处于待处理状态,但我仍会显示旧版本的数据。存储这些等待批准的更改的最佳方式是什么?

我想了几种方法,但不知道什么是最好的方法。这是一个非常小的网络应用程序。一种方法是创建一个模仿另一个表模式的 PendingChanges 表,然后一旦更改获得批准,我就可以使用信息更新真实表。另一种方法是进行某种记录版本控制,我将多个版本的数据存储在表中,然后始终提取已标记为已批准的最高版本号的记录。这将限制额外表的数量(我需要为多个表执行此操作),但每次我提取一组记录时都需要进行额外处理以确保获得正确的记录。

对这些方法或其他可能好的方法有任何个人经验吗?

更新:澄清一下,在这种特殊情况下,我对历史数据不太感兴趣。我只需要某种方式来批准用户在网站上上线之前所做的任何更改。因此,用户将编辑他们的“个人资料”,然后管理员将查看该修改并批准它。一旦批准,将成为显示值,旧版本不需要保留。

任何人都尝试过下面的解决方案,您可以在特殊的 PendingChanges 表中存储任何需要将它们作为 XML 跟踪的表中的未决更改?每条记录都会有一列表示更改是针对哪个表的,一列可能存储将要更改的记录的 id(如果是新记录,则为 null),一个日期时间列,用于存储更改发生的时间,以及用于存储更改记录的 xml 的列(可能会序列化我的数据对象)。由于我不需要历史记录,因此在批准更改后,将更新真实表并删除 PendingChange 记录。

对这种方法有什么想法吗?

0 投票
9 回答
13452 浏览

sql - 什么是索引以及如何使用它们来优化数据库中的查询?

我正在维护一个相当大的应用程序和数据库,并注意到我们的一些存储过程中的一些数据库性能不佳。

我总是听说可以通过“添加索引”来提高性能。我当然不是 DBA,我不明白什么是索引,它们为什么有用,以及如何创建它们。

我基本上需要一个索引 101。

谁能给我资源让我学习?

0 投票
12 回答
93853 浏览

sql-server - 哪些列通常可以制作好的索引?

作为“什么是索引以及如何使用它们来优化我的数据库中的查询? ”的后续行动,我正在尝试了解索引,哪些列是好的索引候选?专门针对 MS SQL 数据库?

经过一番谷歌搜索后,我读到的所有内容都表明,通常会增加且唯一的列是一个很好的索引(比如 MySQL 的 auto_increment 之类的东西),我理解这一点,但我使用的是 MS SQL,并且我使用的是 GUID 作为主键,所以看起来索引不会使 GUID 列受益...

0 投票
8 回答
4833 浏览

mysql - MySQL:建议的行数

考虑一个有 7 列的索引 MySQL 表,不断地被查询和写入。在通过将数据拆分到其他表中来提高性能之前,该表应该允许包含的建议行数是多少?

0 投票
3 回答
211 浏览

database - 设计网站内容管理系统时要考虑的突出问题和问题

我正在设计我的网站并且很好奇,在我撕掉别人的想法之前,在设计数据库时应该提出哪些突出的考虑和问题?

0 投票
7 回答
386 浏览

database - 数据库设计中的冲突需求,具有两个相似功能的领域

好的,所以我现在正在为“Box Items”制作一张表格。

现在,一个盒子项目,取决于它的用途/项目的状态,最终可能与“运输”盒子或“退货”盒子相关。

Box Item 可能有缺陷:如果是,则会在 Box Item 的行中设置一个标志 (IsDefective),并且 Box Item 将被放入“Returns”框中(与其他物品一起退回给该供应商)。否则,Box Item 最终将被放入“Shipping”盒子(与其他要运送的物品一起)。(请注意,运输和退货箱有自己的表格:所有箱子都没有一个公用表格......尽管如果可能的话,我应该考虑这样做作为第三种可能性?)

也许我今天只是想不清楚,但我开始质疑在这种情况下应该怎么做。

我的直觉告诉我,我应该为每个可能的关系设置一个单独的字段,即使在任何给定时间只能发生其中一个关系,这将使 Box Items 的架构看起来像:

BoxItemID 描述 IsDefective ShippingBoxID ReturnBoxID 等...

这将使关系变得清晰,但似乎很浪费(因为任何时候都只会使用其中一个关系)。所以我想我可以只有一个 BoxID 字段,并根据 IsDefective 字段确定它指的是哪个 BoxID(运输或退货箱 ID):

BoxItemID 描述 IsDefective BoxID 等...

这似乎不那么浪费,但不适合我。关系不明显。

所以,我把它交给你,Stackoverflow 的数据库专家。在这个情况下,你会怎么做?

编辑:谢谢大家的意见!它给了我很多思考。一方面,下次我开始这样的项目时,我将使用 ORM。=)两个,因为我现在不在,我会咬四个字节并使用两个字段。

再次感谢大家!

0 投票
4 回答
4026 浏览

sql-server - 分层组的数据库架构

我正在为用作更大系统基础的组层次结构进行数据库设计。每个组可以包含其他组,也可以包含“设备”作为叶对象(设备下方没有任何内容)。

正在使用的数据库是 MS SQL 2005。(虽然在 MS SQL 2000 中工作将是一个好处;不幸的是,需要 MS SQL 2008 的解决方案目前不可行)。

有不同类型的组,这些组需要是动态的,并且用户可以在运行时定义。例如,组类型可能是“客户”、“帐户”、“城市”或“建筑物”、“楼层”,并且每种类型将具有一组不同的属性,可由用户定义。还将应用业务规则-例如,“楼层”只能包含在“建筑物”组下,并且再次,这些可以在运行时定义。

许多应用程序功能来自基于这些组运行报告,因此需要一种相对快速的方法来获取某个组(和所有子组)中包含的所有设备的列表。

使用修改的预排序树遍历技术存储组的优点是速度快,但缺点是相当复杂和脆弱 - 如果外部用户/应用程序修改数据库,则有可能完全损坏。我们还实现了一个 ORM 层,这种方法似乎在大多数 ORM 库中使用关系变得复杂。

使用公用表表达式和“标准”id/parentid 组关系似乎是避免运行多个递归查询的有效方法。这种方法有什么缺点吗?

至于属性,存储它们的最佳方式是什么?一张又长又窄的桌子,与小组有关?是否应该将通用属性(例如“名称”)存储在组表中,而不是属性表中(很多时候,名称将是显示所需的全部内容)?

使用这种方法是否会出现性能问题(假设在合理的硬件上(例如四核 Xeon 2 Ghz、4GB ram)上平均有 2000 个组,每个组平均有 6 个属性,平均有 10 个并发用户,折扣任何其他过程)?

随意提出与我在这里概述的完全不同的架构。我只是想说明我关心的问题。

0 投票
10 回答
7840 浏览

database - 可视化设计数据库结构

我很高兴在创建数据库时手动编写表格,但这并不是将有关数据库的信息传达给其他人的最简单方法,尤其是那些不太习惯通过脚本对表格进行编码的人,而是会在 phpMyAdmin 上使用类似的东西.

因此是否有一个免费程序(对我来说,它必须在 Mac 上运行,但可以随意向其他具有相同 Q 的人推荐 PC 应用程序)或脚本(最好是 PHP 或 Python),允许您设计数据库结构,然后将输出用户选择的基本图表或代码?

0 投票
6 回答
1239 浏览

database-design - 您是否根据保留字列表检查您的字段和表名称?

我的字段、表、查看器存储过程名称有时会出现问题。例子:

问题是from是 SQL-92 中的保留字。您可以将字段名放在双引号中来解决这个问题,但是如果其他一些数据库工具想要读取您的数据库怎么办?这是您的数据库设计,如果其他应用程序对您的数据库有问题,那是您的错。

还有许多其他保留字(~300),我们应该避免所有这些。如果您将 DBMS 从制造商 A 更改为 B,您的应用程序可能会失败,因为一些字段名现在是保留字。一个名为PERCENT的字段可能适用于 oracle 数据库,但在 MS SQL Server 上,它必须被视为保留字。

我有一个工具可以对照这些保留字检查我的数据库设计;你也是?

这是我的规则

  1. 不要使用超过 32 个字符的名称(某些 DBMS 无法处理更长的名称)
  2. 仅使用 az、AZ、0-9 和下划线(:-;,/&!=?+- 是不允许的)
  3. 不要以数字开头的名字
  4. 避免这些保留字
0 投票
5 回答
9859 浏览

database - 最佳实践:将项目的工作流状态存储在数据库中?

我有一个关于如何存储复杂工作流状态以在数据库中处理任务的最佳实践的问题。我一直在网上寻找无济于事,所以我想我会问社区他们认为什么是最好的。

这个问题来自我在上一个问题中给出的同一个“BoxItem”示例。这个“BoxItem”在我的系统中被跟踪,因为它执行了各种任务。该任务可能会持续数天并需要人工交互,因此必须保持 BoxItem 的状态。还必须跟踪谁完成了任务(如果适用)以及任务完成的时间。

起初,我通过在“BoxItems”表中为每个需要完成的人工交互任务添加三个字段来解决这个问题:

任务名称是否完整

日期TaskName完成

用户任务名完成

当工作流程很简单时,这很有效……但现在它已经发展成为一个复杂的流程(流程中可能有 10 个以上的人机交互……其中大约一半是可选的,可能会或可能不会针对 BoxItem 完成,这导致我开始为那些可选任务添加“Do TaskName ”字段),我发现应该是一个简单的表现在有 40 个左右的字段完全用于保留此状态信息。

我发现自己在问是否有更好的方法来做到这一点......但我不知所措。

我的第一个想法是制作一个通用的“BoxItemTasks”表,它定义了可以在给定盒子上完成的任务,但我仍然需要单独保存日期和用户信息,所以它并没有真正帮助。

我的第二个想法是,也许这无关紧要,如果这张表有 40 个或更多用于状态保留的字段,我不应该担心......也许我只是偏执。但感觉要保留很多信息。

无论如何,我不知道第三种选择可能是什么,或者上述两种选择中的一种是否真的合理。我可以看到这个工作流程在未来可能会变得更加复杂,对于每一个新任务,我需要添加 3-4 个字段来支持它的跟踪......感觉就像它正在失控。

在这个情况下,你会怎么做?

我应该注意,这是对现有系统的维护,它是在没有 ORM 的情况下构建的,所以我不能把它留给 ORM 来处理。

编辑:

凯夫,你是在谈论做这样的事情:

盒子物品

(PK) BoxItemID

(其他无关的东西)

BoxItemActions

(PK) BoxItemID

(PK) BoxItemTaskID

完成了

完成日期

用户已完成

BoxItemTasks

(PK) 任务类型

描述(如果有必要)

嗯......这会起作用......它代表需要改变我目前执行 SQL 查询的方式以查看哪些项目处于什么状态,但从长远来看,这样的事情看起来会更好(没有进行像序列化想法所代表的基本设计更改......虽然如果我有时间,我想按照我的想法去做。)。

这就是你提到的Kin,还是我不同意?

编辑:啊,我也看到了你的想法,用“最后一个动作”来确定当前状态......我喜欢它!我认为这可能对我有用......我可能需要稍微改变一下(因为在某些时候任务会同时发生),但这个想法似乎是个好主意!

编辑最后:总而言之,如果其他人在未来用同样的问题来查找这个......听起来如果您的系统将信息预加载到某个可查询的界面中(即不直接调用数据库本身,就像我正在处理的临时系统那样),但如果你没有那个,附加表的想法似乎应该很好用!谢谢大家的回复!