简单的例子:有一张客户表。
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) 我在 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)
列e、k和n都是 NULL,它们根本不存储任何值,此时完全没用。它们是原始设计的一部分,但从未被移除。
编辑 - 大多数其他列都是非 NULL。
问题:
如何计算这对存储的影响?它是否等于列的大小 * 行数?
删除这些空列会显着提高该表的性能吗?页面缓存能够容纳更多行吗?
postgresql performance database-design storage disk-space postgresql-performance
我必须为涉及音乐艺术家描述的业务环境设计实体关系图 (ERD) ,我将在下面详细说明。
一个艺术家有一个名称,且必须要么一组 或一个独奏演员(但不能同时)。
一个小组由一名或多名独舞者组成,并有若干成员(应根据组成该组的独奏者人数计算)。
一个独奏演员可能是一个会员众多的群体或无的集团,并可以播放一个或多个仪器。
如何构建一个 ERD 来表示这种场景?我对它的“或”部分感到困惑。
您可以看到许多关于多级联路径的问题。例如:
但是,从我所看到和理解的情况来看,您可以在许多情况下删除子记录,而不仅仅是删除相关主记录的一种情况。
虽然在一个问题中说 SQL Server 试图通过防止这种情况发生来确保安全,但我真的不明白如果我们有多个级联路径可能会出现什么问题,以及它可以防止哪些问题使其安全?
我希望有人能用通俗易懂的语言向我解释这一点,最好使用多个级联路径可能出现问题的示例。
我有一个Answers表和一个Questions表。
答案表中有值,但根据问题,这个值可以是一个bit,nvarchar或number(到目前为止)。该问题有其意的答案值类型应该是什么概念。
在某一点或另一点解析这些Answer值非常重要,因为至少需要比较这些数字。
对于更多的上下文,问题和潜在答案(通常是允许文本框类型输入的数据类型)由某些用户在各种调查中提供。然后由其他指定用户提供答案。
我考虑过的几个选项是:
A. 根据预期类型(在问题中记录)不同解析的 XML 或字符串
B. 三个单独的表,它们引用(或被引用)Answer 表并根据预期类型连接到其中。在这种情况下,我不确定设置约束以确保每个问题只有一个答案的最佳方法,或者是否应该将答案留给应用程序。
C. Answer 表上的三个单独的列,可以根据预期的类型进行检索。
我很乐意就这些方法的优缺点或我没有考虑过的替代方法获得一些意见。
有人能帮我理解这个用户对CustomerLocation表的回答吗?我真的想要一个在订单表中存储地址的好方法。
我正在寻找的是如何设置我的地址,以便在我编辑它们时,订单不受客户更新地址或搬迁这一事实的影响。
就目前而言,我的架构看起来类似于:
Person |EntityID|
EntityAddress |EntityID|AddressID|
Address |AddressID|AddressType|AddressLine1|AddressLine2|
Order |OrderID|BillingAddressID|
Run Code Online (Sandbox Code Playgroud) 我有第二范式 (2NF) 的问题,我无法使用 Google 解决它。这让我发疯,因为我是一名老师,我不想教我的学生错误的东西。
让我们有一个包含 5 个字段的表。
评分 = {学生姓名、学科代码、学科名称、#考试、成绩}
依赖是这样的:
学生姓名、学科代码、#考试 -> 成绩
主题代码 -> 主题名称
主题名称 -> 主题代码
因此,候选键 1 是{StudentName, SubjectCode, #Exam},候选键 2 是{StudentName, SubjectName, #Exam}。
主要属性是{StudentName, SubjectCode, SubjectName, #Exam},非主要属性是Grade
根据第二范式的定义,非主属性不能依赖于候选键的一部分。唯一的非主要属性 (Grade) 不依赖于候选键的一部分,因此该表似乎在 2NF 中。
问题是我认为有些不对劲(我可能是错的)。我认为科目应该有自己的桌子。
评分 = {学生姓名,学科代码,#考试,成绩}
主题 = {主题代码,主题名称}
但是 2NF 不会产生这个。3NF 是关于非主要属性之间的依赖关系,因此它也不会产生这种依赖关系。但在我看来,这是正确的结果,因为它没有冗余。
我猜如果非主要属性被定义为“不是候选键的属性”,2NF 会产生想要的结果。但是我一次又一次地检查了这一点,非主要属性被定义为“不属于候选键的属性”。
我究竟做错了什么?
有没有办法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 。
我正在寻找有关存储调查、问题和响应的最佳关系建模方法的建议。
我正在寻找以下两种方法中的哪一种看起来最好,或者另一种方法。
我至少有这些实体:
至少有这些关系:
这就是我遇到麻烦的地方:如何对一个人对调查问题的回答进行建模。
这是我考虑过的两种方法,对我来说似乎都不是很好。此处的图表已大大简化以说明问题。
我不喜欢这种方法的地方:
survey_person_question_response表有两个不同的列引用调查:survey_question_survey_id和survey_person_survey_id
survey_id在这两列的一行中引用不同的是错误的。survey_question 必须与该人在survey_person 中进行的调查来自同一个调查。我看不出有什么好的方法来强制执行此操作。方法二:
尽量避免方法 1 中的两个 FK 应该引用相同的值......

我不喜欢这种方法的地方:
question_id和survey_idFK 来自有效的survey_question对survey_id和person_idFK 来自有效的survey_person对任何建议:
将不胜感激!
在 Postgres 列上创建唯一约束是否不需要对其进行索引?
我希望自动需要一个索引来有效地维护约束。
database-design ×10
postgresql ×3
erd ×2
sql-server ×2
cascade ×1
disk-space ×1
eav ×1
foreign-key ×1
index ×1
many-to-many ×1
performance ×1
storage ×1
subtypes ×1