标签: database-design

我应该添加传递外键吗?

简单的例子:有一张客户表。

create table Customers (
  id integer,
  constraint CustomersPK primary key (id)
)
Run Code Online (Sandbox Code Playgroud)

数据库中的所有其他数据都应该链接到 a Customer,例如Orders看起来像这样:

create table Orders (
  id integer,
  customer integer,
  constraint OrdersPK primary key (customer, id),
  constraint OrdersFKCustomers foreign key (customer) references Customers (id)
)
Run Code Online (Sandbox Code Playgroud)

假设现在有一个表链接到Orders

create table Items (
  id integer,
  customer integer,
  order integer,
  constraint ItemsPK primary key (customer, id),
  constraint ItemsFKOrders foreign key (customer, order) references Orders (customer, id)
)
Run Code Online (Sandbox Code Playgroud)

我应该从Itemsto添加一个单独的外键Customers吗?

...
constraint ItemsFKCustomers …
Run Code Online (Sandbox Code Playgroud)

foreign-key database-design

13
推荐指数
1
解决办法
1255
查看次数

大表中完全空的列如何影响性能?

我在 Postgres 数据库中有 4 亿行,表有 18 列:

id serial NOT NULL,
a integer,
b integer,
c integer,
d smallint,
e timestamp without time zone,
f smallint,
g timestamp without time zone,
h integer,
i timestamp without time zone,
j integer,
k character varying(32),
l integer,
m smallint,
n smallint,
o character varying(36),
p character varying(100),
q character varying(100)
Run Code Online (Sandbox Code Playgroud)

ekn都是 NULL,它们根本不存储任何值,此时完全没用。它们是原始设计的一部分,但从未被移除。

编辑 - 大多数其他列都是非 NULL。

问题:

  1. 如何计算这对存储的影响?它是否等于列的大小 * 行数?

  2. 删除这些空列会显着提高该表的性能吗?页面缓存能够容纳更多行吗?

postgresql performance database-design storage disk-space postgresql-performance

13
推荐指数
1
解决办法
4824
查看次数

模拟每个音乐艺术家都是一个团体或独奏者的场景

我必须为涉及音乐艺术家描述的业务环境设计实体关系图 (ERD) ,我将在下面详细说明。

场景描述

  • 一个艺术家有一个名称,且必须要么 一个独奏演员(但不能同时)。

  • 一个小组由一名或多名独舞者组成,并有若干成员(应根据组成该独奏者人数计算)。

  • 一个独奏演员可能是一个会员众多的群体或无的集团,并可以播放一个或多个仪器

如何构建一个 ERD 来表示这种场景?我对它的“或”部分感到困惑。

erd database-design database-diagrams subtypes many-to-many

13
推荐指数
1
解决办法
6809
查看次数

为什么我们不能有多个级联路径?

您可以看到许多关于多级联路径的问题。例如:

/sf/ask/59613781/

/sf/ask/424585101/

/sf/ask/1932918221/

但是,从我所看到和理解的情况来看,您可以在许多情况下删除子记录,而不仅仅是删除相关主记录的一种情况。

虽然在一个问题中说 SQL Server 试图通过防止这种情况发生来确保安全,但我真的不明白如果我们有多个级联路径可能会出现什么问题,以及它可以防止哪些问题使其安全

我希望有人能用通俗易懂的语言向我解释这一点,最好使用多个级联路径可能出现问题的示例。

database-design sql-server cascade

13
推荐指数
1
解决办法
5647
查看次数

存储可能是多种不同类型的值的正确方法

我有一个Answers表和一个Questions表。

答案表中有值,但根据问题,这个值可以是一个bitnvarcharnumber(到目前为止)。该问题有其意的答案值类型应该是什么概念。

在某一点或另一点解析这些Answer值非常重要,因为至少需要比较这些数字。

对于更多的上下文,问题和潜在答案(通常是允许文本框类型输入的数据类型)由某些用户在各种调查中提供。然后由其他指定用户提供答案。

我考虑过的几个选项是:

A. 根据预期类型(在问题中记录)不同解析的 XML 或字符串

B. 三个单独的表,它们引用(或被引用)Answer 表并根据预期类型连接到其中。在这种情况下,我不确定设置约束以确保每个问题只有一个答案的最佳方法,或者是否应该将答案留给应用程序。

C. Answer 表上的三个单独的列,可以根据预期的类型进行检索。

我很乐意就这些方法的优缺点或我没有考虑过的替代方法获得一些意见。

database-design sql-server eav

13
推荐指数
1
解决办法
9116
查看次数

在订单表中存储账单地址最佳实践

有人能帮我理解这个用户对CustomerLocation表的回答吗?我真的想要一个在订单表中存储地址的好方法。

我正在寻找的是如何设置我的地址,以便在我编辑它们时,订单不受客户更新地址或搬迁这一事实的影响。

就目前而言,我的架构看起来类似于:

 Person           |EntityID|
 EntityAddress    |EntityID|AddressID|
 Address          |AddressID|AddressType|AddressLine1|AddressLine2|
 Order            |OrderID|BillingAddressID|
Run Code Online (Sandbox Code Playgroud)

database-design best-practices

13
推荐指数
1
解决办法
3万
查看次数

举例说明 2NF 与 3NF

我有第二范式 (2NF) 的问题,我无法使用 Google 解决它。这让我发疯,因为我是一名老师,我不想教我的学生错误的东西。

让我们有一个包含 5 个字段的表。

评分 = {学生姓名、学科代码、学科名称、#考试、成绩}

依赖是这样的:

学生姓名、学科代码、#考试 -> 成绩

主题代码 -> 主题名称

主题名称 -> 主题代码

因此,候选键 1 是{StudentName, SubjectCode, #Exam},候选键 2 是{StudentName, SubjectName, #Exam}

主要属性是{StudentName, SubjectCode, SubjectName, #Exam},非主要属性是Grade

根据第二范式的定义,非主属性不能依赖于候选键的一部分。唯一的非主要属性 (Grade) 不依赖于候选键的一部分,因此该表似乎在 2NF 中。

问题是我认为有些不对劲(我可能是错的)。我认为科目应该有自己的桌子。

评分 = {学生姓名,学科代码,#考试,成绩}

主题 = {主题代码,主题名称}

但是 2NF 不会产生这个。3NF 是关于非主要属性之间的依赖关系,因此它也不会产生这种依赖关系。但在我看来,这是正确的结果,因为它没有冗余。

我猜如果非主要属性被定义为“不是候选键的属性”,2NF 会产生想要的结果。但是我一次又一次地检查了这一点,非主要属性被定义为“不属于候选键的属性”。

我究竟做错了什么?

normalization database-design relational-theory

13
推荐指数
2
解决办法
7202
查看次数

PostgreSQL LIKE 对 ARRAY 字段的查询

有没有办法LIKE在 ARRAY 字段上进行Postgres查询?

目前我想要这样的东西:

SELECT * FROM list WHERE lower(array_field) LIKE '1234%'
Run Code Online (Sandbox Code Playgroud)

目前不需要那么多。但是它应该在 ARRAY 中找到一个匹配的字段。这甚至可能吗?

目前我使用物化视图来生成带有 JOIN 和 a 的“列表”表ARRAY_AGG(),因为我加入了一个表,其中更多的值可能在正确的表上。这会重复左表中的字段,这不是我想要的。

编辑这就是我创建视图的方式(非常缓慢和丑陋):

CREATE MATERIALIZED VIEW article_list_new AS
SELECT a.id, 
       a.oa_nr, 
       a.date_deleted, 
       a.lock, 
       a.sds_nr, 
       a.kd_art_nr, 
       a.kd_art_index, 
       a.kd_art_extend, 
       a.surface, 
       a.execution, 
       a.surface_area, 
       a.cu_thickness, 
       a.endintensity, 
       a.drilling, 
       array_agg(o.id::text) AS offer_list 
FROM article_list a LEFT JOIN task_offer o ON o.article = a.oa_nr 
GROUP BY .....;  
Run Code Online (Sandbox Code Playgroud)

我还需要返回task_offer表的 ID 。

postgresql database-design pattern-matching

13
推荐指数
1
解决办法
2万
查看次数

处理有关调查、问题和响应的数据库中冗余外键的最佳数据建模方法

我正在寻找有关存储调查、问题和响应的最佳关系建模方法的建议。

我正在寻找以下两种方法中的哪一种看起来最好,或者另一种方法。

我至少有这些实体:

  • 民意调查

至少有这些关系:

  • 每个调查有 1 个或多个问题。
  • 每个问题可用于 0 个或多个调查。
  • 每个人可以参加 0 个或多个调查。

这就是我遇到麻烦的地方:如何对一个人对调查问题的回答进行建模。

这是我考虑过的两种方法,对我来说似乎都不是很好。此处的图表已大大简化以说明问题。

方法一: 方法一

我不喜欢这种方法的地方:

  • survey_person_question_response表有两个不同的列引用调查:survey_question_survey_idsurvey_person_survey_id
    • survey_id在这两列的一行中引用不同的是错误的。survey_question 必须与该人在survey_person 中进行的调查来自同一个调查。我看不出有什么好的方法来强制执行此操作。
  • 似乎我在这里所做的是在两种关系之间建立关系。出于某种原因,这对我来说是错误的。

方法二:

尽量避免方法 1 中的两个 FK 应该引用相同的值...... 在此处输入图片说明

我不喜欢这种方法的地方:

  • 没有强制规定question_idsurvey_idFK 来自有效的survey_question
  • 没有强制规定survey_idperson_idFK 来自有效的survey_person

任何建议:

  • 这些方法之一是否是典型方法
  • 其中一种方法相对于另一种方法的优缺点
  • 完全安排这些数据的更好方法

将不胜感激!

erd database-design

13
推荐指数
1
解决办法
2042
查看次数

在 Postgres 列上创建唯一约束是否不需要对其进行索引?

在 Postgres 列上创建唯一约束是否不需要对其进行索引?

我希望自动需要一个索引来有效地维护约束。

postgresql index database-design unique-constraint

13
推荐指数
1
解决办法
4618
查看次数