我已经开发了一段时间,但以前从未真正处理过数据库/缩放问题。这突然发生了变化,我发现自己陷入了深渊。
我有 2 个 SQL 表,例如:
VOTES
vote_id (PK)
question_id (FK)
user_id (FK)
option_id (FK) <The option the user voted for>
Run Code Online (Sandbox Code Playgroud)
“问题”表如下所示:
QUESTIONS
question_id (PK)
option_1 (FK --> Options)
option_2 (FK --> Options)
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是,我经常必须检索某个问题的所有 option_1 票(或 option_2 票)的总和。这是目前通过选择 count where question_id = [@question.id] 和 option_id = [@question.option_1.id]"
我猜将 option_1_votes 和 option_2_votes 列添加到“问题”表并在每次添加投票时增加它们会更快。但归根结底,这是冗余数据。
所以,作为一个对数据库设计原则一无所知的人,这里的经验法则是什么?顶级 DBA 会只是添加列,还是尝试其他解决方案?
干杯...
我们正在计划一个带有新数据库 (MS SQL Server) 的新系统。
我们有以下实体和以下关系:
实体: 俱乐部、链、支付类型等...
关系: 俱乐部-连锁(MM);(Clubs_Chains)-佣金(1-1);Clubs-Chains-PaymentTypes (MM);
我们希望对数据库进行规范化。我们考虑了以下选项,但我们不确定它是否是该场景的最佳解决方案:
Clubs_Chains 表: ClubChainID PK int 不为 null,ClubID FK int 不为 null,ChainID FK int 不为 null,Commission int
Clubs_Chains_PayMethod 表: ClubChainID PK int 不为空,PaymentTypeID PK int 不为空
谢谢!
如何规范化具有四列的表以记录单行的最新活动:
创建于
由...制作
修改时间
修改者
我们有几十个表,都有这 4 列。有没有办法或模式以有效和灵活的方式对此进行规范化?
我目前正在为我的考试而学习,我遇到的麻烦是如何将具有给定函数依赖关系的关系 R 分解为 2NF 然后是 3NF。
例如对于以下 R 和函数依赖项:
R = {A, B, C, D, E, F, G, H, I, J}
Functional dependencies F = ( {A, B} -> {C}, {A} -> {D, E}, {B} -> {F}, {F}
-> {G, H}, {D} -> {I,J} }
我知道首先你必须找出闭包来找到 R 的键,我已经完成了,键是 {A,B},现在这就是我卡住的地方。除了 2NF 和 3NF 的定义之外,我的教科书没有给出任何关于如何解决这个问题的例子。
关于我如何做到这一点的示例将不胜感激。
我正在设计一个跟踪 IT 硬件的资产管理数据库。我决定使用超类型/子类型设计。我现在想跟踪设备更改的历史记录。我想使用单独的历史表,但我无法决定如何跟踪对子类型表所做更改的历史记录。
如果我为每个子类型表使用单独的历史表,我可以通过将它们与超类型历史表连接来重建记录,除非子类型历史表独立于超类型历史表而改变。独立地,我的意思是对超类型表中的数据进行了x 次更新,创建了x 次超类型历史记录,对子类型表进行了y 次更新,创建了y次子类型历史记录。如果在同一天进行更改,我将如何重建记录?
这是对超类型/子类型的良好使用,还是我应该对表进行非规范化?否则,有人可以建议任何方法来解决此类设计的历史问题吗?
使用 MS SQL Server 2008。
这是一个非常简化的 ERD:

假设在 Postgres 数据库中,您有一个名为 的表party,它可以有少于 5 个明确定义的,party_types例如“人”或“组织”。
您会将存储party_type在party表中(例如party_type = 'Person')还是对其进行标准化(例如party.party_type = 1和party_type(id, name) = (1, 'Person'))?
为什么?
postgresql normalization database-design dimensional-modeling
这听起来像是一个愚蠢的问题,但我是一名刚接触数据库设计的软件开发人员......所以这个概念对我来说很有意义,但也许这并不适用——
表 B 中记录中的字段是否可以简单地指向表 A 中记录中的字段?
示例:如果我有两个表……一个包含所有员工的列表,另一个包含这些员工进出办公室的历史记录。
Employees
ID
First Name
Last Name
History
Event ID
Event Time
Event Type (Entry/Exit)
EmployeeID
Run Code Online (Sandbox Code Playgroud)
我可以使用外键在 History.EmployeeID 和 Employees.ID 之间建立关系,但会重复数据。那么 History.EmployeeID 和 Employees.ID 将包含相同的 ID 号,它们将在内存中存储两次。因此,如果我进入数据库并更改了 John Smith 的员工 ID,则需要编写脚本或其他内容来搜索数据库并查找/替换该 ID。
我想要的是Employees.ID 包含真实ID 和History.EmployeeID 只包含一个指向Employees.ID 的指针。这样,如果我更新 John Smith 的 ID,更改将集中到一张表中的一个字段。
这可能吗?
谢谢
什么是ID 反模式,为什么/在什么情况下它被视为反模式?
id 反模式在每个表中都有一个唯一的 ID 列。为每条新记录生成 ID。为什么这是一个反模式?– 安德鲁沃尔夫 11 分钟前
我有一些数据很难建模。特别是,我不确定如何确保我拥有唯一的数据。这是我将团队分配到商店的时间表。一个团队将连续两天被安排在同一家商店,但我必须确保在给定的时间段(或“周期”)内安排他们不超过 2 天。
数据的电子表格表示如下所示。
Run Code Online (Sandbox Code Playgroud)Cycle Team Store Date 1 1 1 1-Dec 1 1 1 2-Dec 1 1 2 3-Dec 1 1 2 4-Dec 1 1 3 8-Dec 1 1 3 9-Dec 1 1 4 10-Dec 1 1 4 11-Dec 1 2 10 1-Dec 1 2 10 2-Dec 1 2 11 3-Dec 1 2 11 4-Dec 1 2 12 8-Dec 1 2 12 9-Dec 1 2 13 10-Dec 1 2 13 11-Dec
我已经有了一个运行良好的团队/商店交叉引用,但达到这种粒度级别是新的。如果我可以在 Team/Store/Date 上放置一个复合主键会很容易,但我显然不能这样做,或者我只能存储两个预定日期中的一个。
迄今为止,我已经考虑使用具有一对多关系的日期表,从 Team/Store 到现在,但这似乎并没有解决唯一性问题,并增加了一些愚蠢的开销。
有没有人对如何建模有任何建议?
该标签似乎不合适,因为这确实是我问的一个抽象设计问题,但我使用的是 …
我是一名 A-level 计算机科学专业的学生,我的老师无法解释如何让我从 UNF 升至 1NF。我已经研究了一点,但我不确定这张表(下面)是否在 1NF 中。我已经将 UNF 格式留给了我认为是 1NF。
UNF格式
我认为是1NF
normalization ×10
date ×1
log ×1
mysql ×1
optimization ×1
postgresql ×1
primary-key ×1
sql-server ×1