我知道这里和这里有人问过这个问题,但我有不同的可能实现的相同想法,我需要一些帮助。
最初,我的blogstories表具有以下结构:
| Column | Type | Description |
|-----------|-------------|------------------------------------------------|
| uid | varchar(15) | 15 characters unique generated id |
| title | varchar(60) | story title |
| content | longtext | story content |
| author | varchar(10) | id of the user that originally wrote the story |
| timestamp | int | integer generated with microtime() |
Run Code Online (Sandbox Code Playgroud)
在我决定要为博客上的每个故事实施一些版本控制系统后,我想到的第一件事就是创建一个不同的表来保存编辑;在那之后,我想我可以修改现有的表来保存版本而不是edits。这是我想到的结构:
| Column …Run Code Online (Sandbox Code Playgroud) 我需要跟踪产品价格变化,以便我可以在数据库中查询给定日期的产品价格。该信息用于计算历史审计的系统中,因此它必须根据购买日期返回正确产品的正确价格。
我更喜欢使用 postgres 来构建数据库。
我需要数据库的设计,但也欢迎任何和所有最佳实践建议。
我正在研究一个数据建模项目,我正在尝试为一个history只有四列的表找出最好的数据建模方法:
CREATE TABLE FooHistory
(
SecurityID INT (FK), -- Part of the natural PK.
FieldID INT (FK), -- Part of the natural PK.
DateCreated DATETIME2(0), -- Part of the natural PK.
Value VARCHAR(50)
);
Run Code Online (Sandbox Code Playgroud)
此表中的自然复合 KEY 将是(DateCreated, SecurityId, FieldID),并且 ETL 过程每 30 分钟将向此表添加 ~ 2K 行。
问题
声明复合 PRIMARY KEY (PK)(DateCreated, SecurityId, FieldID)与添加新 IDENTITY 列(即系统生成的代理)并将其用作 PK 的优缺点?
我相信,如果我添加一个 IDENTITY 列并将其用作 PK,那么该表将不会处于第三范式(3NF)中,因为非 PK 列之间将存在函数依赖关系,即,(DateCreated, SecurityId, FieldID)和Value.
由于此表保留了历史数据,因此我不希望将此表加入其他外部表,应用程序将主要使用 SELECT 语句与其进行交互。基于这些假设,将表保持在 …
在创建数据库结构时,我倾向于为每组需要唯一的数据创建唯一的复合键。在它们旁边我通常使用主键(通常是 INT AI id),除非复合键确实足以识别记录。
一方面,好处是我可以避免插入“坏记录”。是否存在这些密钥的使用变得过多或数据库设计不佳的迹象?
在我现在正在处理的数据库中,几乎每个实体都有这 4 列:
CreatedDate
CreatedBy
RetiredDate
RetiredBy
Run Code Online (Sandbox Code Playgroud)
通常这用于记录目的,对于某些实体来说,知道它何时退役的有用性是有争议的(但不要告诉我的老板)。对于其他一些东西,(比如卡车)它更有意义,因为“退役”的车辆可能会重新投入使用。
无论如何,我想知道将这些信息放在一张桌子上是否是个好主意,因为它到处重复。如果是的话,任何人都有一个好名字..?简单created_retired_dates吗?
我的tasks数据库中有一个表,在感兴趣的业务领域中,任务可以有多种状态:“打开”、“开始”、“审查中”和“已完成”。
尽管在同一个表中有“打开”和“开始”,但使用标志标识,但出于某种原因,我很早就决定将“审查中”和“已完成” 任务放在他们自己的单独表中。虽然这似乎是一个好主意,可以轻松查询特定事物,但当我考虑为任务实现注释功能时,我意识到值会在三个表中发生变化。task_id
我做错了吗?
当前的考虑
我想到的一些解决方案是重做组织并将所有内容放在一张桌子上,使用标志来纯粹区分状态(这将导致大量的返工);创建某种UUID可以跨表转移的东西 - 尽管我认为如果这样做可能会导致性能问题;最后,将IDs跨表设置为不再自动递增,并简单地“继承”第一个task表(自动递增)的原始值。
在这种情况下做了什么?我不是最精通数据库设计的人,而且我在进行过程中正在编造这一点。
任何帮助将不胜感激。
对@MDCCL 通过评论提出的进一步信息请求的回应
因此,状态(或状态)一个的任务,可以随着时间而改变,对不对?同一个具体的任务可以出现多少次相同的状态,比如“打开”?它会根据相关任务呈现的状态类型而变化吗?
是的,一个task.state理论上最多可以改变四次。我不会详细介绍逻辑,但最长的链将是“begun” ? “completed” ? “review” ? “completed”. 每次,目前,它们都被放入另一张桌子。
例外的是,无论它是否“开始”,用户都可能会无限地放弃然后重新执行任务——至少在理论上是这样。这至少得益于“开始”状态是一个标志这一事实。
好的,但是某个任务将始终呈现一个特定的“当前”状态,对吗?例如,当 …