标签: database-design

外键有什么问题?

我记得听过Joel Spolsky播客014中提到他几乎没用过外键(如果我没记错的话).但是,对我而言,在整个数据库中避免重复和后续数据完整性问题似乎非常重要.

人们有一些坚实的理由为什么(避免与Stack Overflow原则一致的讨论)?

编辑: "我还没有理由创建一个外键,所以这可能是我实际设置一个外键的第一个原因."

database database-design referential-integrity foreign-keys data-integrity

250
推荐指数
12
解决办法
11万
查看次数

"防止需要重新创建表的保存更改"负面影响

前言

我今天在SQL Server 2008中修改了一个列,将数据类型从货币(18,0)更改为(19,2).

我收到错误"您所做的更改需要从SQL Server中删除并重新创建以下表".

在您争相回答之前,请阅读以下内容:

我已经知道工具►选项►设计器►表和数据库设计器中有选项►取消选中 "禁止保存需要重新创建表的更改" . 通过五次单击阻止保存需要重新创建表的更改 ......所以不要回答!

实际问题

我的实际问题是针对其他事情,如下:

这样做有任何负面影响/可能的缺点吗?

当取消选中此框时,表是否会被实际删除并自动重新创建?

如果是这样,表格是否复制了源表的100%完全复制品?

sql-server database-design sql-server-2005 sql-server-2008

248
推荐指数
4
解决办法
18万
查看次数

首次数据库设计:我是否过度工程?

背景

我是CS的第一年学生,我兼职为我爸爸的小生意做准备.我没有任何实际应用程序开发经验.我用Python编写脚本,用C编写一些课程,但没有这样的.

我父亲有一个小型培训业务,目前所有课程都通过外部网络应用程序进行安排,记录和跟进.有一个导出/"报告"功能,但它非常通用,我们需要特定的报告.我们无权访问实际数据库来运行查询.我被要求建立一个自定义报告系统.

我的想法是创建通用CSV导出并导入(可能使用Python)它们每晚都在办公室中托管的MySQL数据库中,从那里我可以运行所需的特定查询.我没有数据库方面的经验,但了解非常基础知识.我已经阅读了一些关于数据库创建和普通表单的内容.

我们可能很快就会开始拥有国际客户,因此我希望数据库在发生这种情况时不会爆炸.我们目前还有几家大公司作为客户,有不同的部门(例如ACME母公司,ACME医疗保健部门,ACME身体护理部门)

我提出的架构如下:

  1. 从客户的角度来看:
    • 客户是主要的表
    • 客户与他们工作的部门相关联
      • 各部门可以分散在一个国家:伦敦的人力资源部门,斯旺西的市场营销部门等.
      • 部门与公司的部门相关联
    • 部门与母公司相关联
  2. 从班级角度来看:
    • 会话是主要的表格
      • 教师与每个课程相关联
      • 每个会话都有一个statusid.例如0 - 已完成,1 - 已取消
      • 会话被分组为任意大小的"包"
    • 每个包都分配给客户端

我在一张纸上"设计"(更像是潦草书写)模式,试图将其标准化为第三种形式.然后我把电源插头插上到MySQL Workbench和它使人们都非常适合我:
(点击查看全尺寸图片)

替代文字http://maian.org/img/schema.png

示例查询我将运行

  • 哪些有信用额度的客户仍处于闲置状态(未来未安排课程的客户)
  • 每个客户/部门/部门的出勤率是多少(以每个会话中的状态ID来衡量)
  • 一个月有一个老师有几节课
  • 标记出勤率低的客户
  • 人力资源部门的自定义报告,其部门的人员出勤率

问题(S)

  • 这是过度工程还是我正确的方向?
  • 对于大多数查询,是否需要连接多个表会导致性能大幅下降?
  • 我已经向客户添加了"lastsession"列,因为它可能是一个常见的查询.这是一个好主意还是我应该严格规范化数据库?

谢谢你的时间

mysql database schema database-design database-normalization

245
推荐指数
5
解决办法
2万
查看次数

如何在设计表时实现一对一,一对多和多对多关系?

任何人都可以解释如何在设计带有一些示例的表时实现一对一,一对多和多对多的关系吗?

sql oracle database-design

236
推荐指数
4
解决办法
26万
查看次数

ON [PRIMARY]是什么意思?

我正在创建一个SQL安装脚本,我正在使用别人的脚本作为示例.这是脚本的一个例子:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[be_Categories](
    [CategoryID] [uniqueidentifier] ROWGUIDCOL  NOT NULL CONSTRAINT [DF_be_Categories_CategoryID]  DEFAULT (newid()),
    [CategoryName] [nvarchar](50) NULL,
    [Description] [nvarchar](200) NULL,
    [ParentID] [uniqueidentifier] NULL,
 CONSTRAINT [PK_be_Categories] PRIMARY KEY CLUSTERED 
(
    [CategoryID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
Run Code Online (Sandbox Code Playgroud)

有谁知道ON [PRIMARY]命令有什么作用?

sql database sql-server database-design

226
推荐指数
4
解决办法
10万
查看次数

使用电子邮件地址作为主键?

与自动递增数字相比,电子邮件地址是主要的不良候选人吗?

我们的Web应用程序需要电子邮件地址在系统中是唯一的.所以,我想过用电子邮件地址作为主键.但是我的同事建议字符串比较比整数比较慢.

是不是使用电子邮件作为主键的正当理由?

我们正在使用PostgreSQL.

sql database postgresql database-design

225
推荐指数
10
解决办法
3万
查看次数

多语言数据库的模式

我正在开发一种多语言软件.就应用程序代码而言,可本地化不是问题.我们可以使用特定于语言的资源,并拥有适合他们的各种工具.

但是,定义多语言数据库模式的最佳方法是什么?假设我们有很多表(100或更多),每个表可以有多个可以本地化的列(大多数nvarchar列应该是可本地化的).例如,其中一个表可能包含产品信息:

CREATE TABLE T_PRODUCT (
  NAME        NVARCHAR(50),
  DESCRIPTION NTEXT,
  PRICE       NUMBER(18, 2)
)
Run Code Online (Sandbox Code Playgroud)

我可以想到三种方法来支持NAME和DESCRIPTION列中的多语言文本:

  1. 每种语言的单独列

    当我们向系统添加新语言时,我们必须创建其他列来存储翻译后的文本,如下所示:

    CREATE TABLE T_PRODUCT (
      NAME_EN        NVARCHAR(50),
      NAME_DE        NVARCHAR(50),
      NAME_SP        NVARCHAR(50),
      DESCRIPTION_EN NTEXT,
      DESCRIPTION_DE NTEXT,
      DESCRIPTION_SP NTEXT,
      PRICE          NUMBER(18,2)
    )
    
    Run Code Online (Sandbox Code Playgroud)
  2. 翻译表与每种语言的列

    不存储翻译的文本,而是仅存储翻译表的外键.转换表包含每种语言的列.

    CREATE TABLE T_PRODUCT (
      NAME_FK        int,
      DESCRIPTION_FK int,
      PRICE          NUMBER(18, 2)
    )
    
    CREATE TABLE T_TRANSLATION (
      TRANSLATION_ID,
      TEXT_EN NTEXT,
      TEXT_DE NTEXT,
      TEXT_SP NTEXT
    )
    
    Run Code Online (Sandbox Code Playgroud)
  3. 用于每种语言的行的转换表

    不存储翻译的文本,而是仅存储翻译表的外键.转换表仅包含一个键,而一个单独的表包含每个语言转换的行.

    CREATE TABLE T_PRODUCT (
      NAME_FK        int,
      DESCRIPTION_FK int,
      PRICE          NUMBER(18, 2)
    )
    
    CREATE TABLE T_TRANSLATION ( …
    Run Code Online (Sandbox Code Playgroud)

multilingual database-design localization

222
推荐指数
5
解决办法
9万
查看次数

使用空列创建唯一约束

我有一个这种布局的表:

CREATE TABLE Favorites
(
  FavoriteId uuid NOT NULL PRIMARY KEY,
  UserId uuid NOT NULL,
  RecipeId uuid NOT NULL,
  MenuId uuid
)
Run Code Online (Sandbox Code Playgroud)

我想创建一个类似于此的唯一约束:

ALTER TABLE Favorites
ADD CONSTRAINT Favorites_UniqueFavorite UNIQUE(UserId, MenuId, RecipeId);
Run Code Online (Sandbox Code Playgroud)

但是,这将允许多行具有相同的(UserId, RecipeId)if MenuId IS NULL.我想允许NULLMenuId存储不具有关联菜单中的最爱,但我只希望每个用户/食谱对这些行中最多只有一个.

我到目前为止的想法是:

  1. 使用一些硬编码的UUID(例如全零)而不是null.
    但是,MenuId每个用户的菜单都有一个FK约束,所以我必须为每个用户创建一个特殊的"空"菜单,这是一个麻烦.

  2. 使用触发器检查是否存在空条目.
    我认为这是一个麻烦,我喜欢尽可能避免触发器.另外,我不相信他们能保证我的数据永远不会处于不良状态.

  3. 只需忘记它并检查中间件或插入函数中是否存在空条目,并且没有此约束.

我正在使用Postgres 9.0.

我有什么方法可以忽略吗?

sql postgresql null database-design referential-integrity

219
推荐指数
2
解决办法
8万
查看次数

如何在数据库中表示继承?

我正在考虑如何在SQL Server数据库中表示复杂的结构.

考虑一个需要存储一系列对象细节的应用程序,这些对象共享一些属性,但有许多其他属性不常见.例如,商业保险计划可能包括同一保单内的责任,汽车,财产和赔偿保险.

在C#等中实现它是微不足道的,因为您可以创建一个带有Sections集合的Policy,其中Section是根据各种类型的封面所需继承的.但是,关系数据库似乎不容易这样做.

我可以看到有两个主要选择:

  1. 为所有可能的变体创建一个Policy表,然后是一个Sections表,其中包含所需的所有字段,其中大部分都是null.

  2. 创建一个Policy表和许多Section表,每个表对应一种封面.

这两种替代方案似乎都不令人满意,特别是因为必须在所有Sections中编写查询,这将涉及大量连接或大量空检查.

这种情况的最佳做法是什么?

sql database inheritance database-design class-table-inheritance

209
推荐指数
5
解决办法
9万
查看次数

每个开发人员应该了解数据库?

无论我们是否喜欢,很多人(如果不是大多数)开发人员要么经常使用数据库,要么可能有一天必须使用数据库.考虑到野外滥用和滥用的数量,以及每天出现的数据库相关问题的数量,可以说开发人员应该知道某些概念 - 即使他们没有设计或使用数据库今天.所以:



开发人员和其他软件专业人员应该了解的有关数据库的重要概念是什么?


回应指南:


保持清单简短.
每个答案的一个概念是最好的.

要具体.
"数据建模"可能是一项重要技能,但这恰恰意味着什么呢?

解释你的理由.
为什么你的概念很重要?不要只说"使用索引".不要陷入"最佳实践".说服您的观众了解更多信息.

Upvote您同意的答案.
首先阅读其他人的答案.一个排名较高的答案是比两个排名较低的答案更有效的陈述.如果您要添加更多内容,请添加评论或引用原始评论.

不要因为它不适用于你个人而投票.
我们都在不同的领域工作.这里的目标是为数据库新手提供指导,以获得对数据库设计和数据库驱动开发的有充分理解和全面理解,而不是争夺最重要的标题.

database language-agnostic database-design

205
推荐指数
18
解决办法
2万
查看次数