2

背景:
两个项目(A & B)在设计时同时需要一个新表(称为DocumentStore)来存放文件/文件在postgres下。数据库设计 - 两个项目应该共享同一个表吗?

但周围的文档存储业务逻辑是项目中的& B之间的不同,这意味着约DocumentStore关系是A & B.

之间的不同让我们把这个有点更具体,见下面的例子:

文档存储表结构看起来是相同的,而不限制/外键:

DocumentStore

DocUUID //unique Id for this document, PK, FK to other table depends on project 
fileName //file name 
fileType //file type 
FileContent //store file as blog 

在项目一个DocumentStore.DocUUID引用Email.EmailUUID

注意是有一个电子邮件之间一对多的关系 - 通过FK> DocumentStore。

Email

EmailUUID //PK 
subject 
title 
... 

在项目DocumentStore.DocUUID引用Letter.LetterUUID

注意是有一个字母之间一对多的关系 - 通过FK> DocumentStore。

Letter

LetterUUID //PK 
UserId 
rightId 
... 

EmailLetter是因为业务逻辑的不同完全不同。


我的问题是:

  1. 我应该分享项目之间的这种DocumentStore表格中的& B'

  2. 如果1.的答案是肯定的,那么如何?通过postgres继承?

  3. 如果1.的答案为否,我应该创建两个具有相同结构但不同表名和不同外键的表吗?一个用于项目A和项目B?

+0

的核心问题是:在同一个文件链接到邮件*和*信往往?多久? –

+0

@ErwinBrandstetter:不同的文件链接到电子邮件和信件。对于信箱(可能是大多数情况下),对于电子邮件案例(可能是2/10箱)的情况会更少。我不确定为什么这是核心问题?你能否详细说明一下? – Gob00st

+0

如果文档中的单个行不在电子邮件和字母之间共享,则最好有单独的表格开头。你的回答我不清楚。我无法毫不含糊地解析“不同的文件链接到电子邮件和信件”。 –

回答

3

只有其中一个fk约束对表的同一个实例的每列有效。你将不得不为每个fk添加一列。或者有两个documentstore表。

当你澄清,同一行中documentstore属于字母或电子邮件,但只有那些的一个,而每个字母/电子邮件可以有多个文件。
因此,我的新建议:坚持你现在有的表设计,但创建两个独立的表。把他们放在同一张桌子里没有任何好处。两个表共享相同结构的事实是没有很好的理由来共享数据。

schema_a.documentstoreschema_b.documentstore继承自master.documentstore。如果您的用例同时处理两个表中的所有行,那么这将非常有用。一定要阅读关于limitations of inheritance in Postgres的章节。特别是,它不会让你定义一个FK约束:

继承特性的一个严重的局限性是索引 (包括唯一约束)和外键约束只适用 单表,而不是给他们的继承儿童。 在外键约束的引用和引用方都是如此。

相关答案与代码示例:
Find out which schema based on table values
Create a table of two types in PostgreSQL

+0

感谢您的答复,但通过DocUUID存在从电子邮件到DocumentStore表的一对多映射。如果我将DocUUID作为外键包含在信件和电子邮件中,它会在电子邮件和信件中引入冗余信息... – Gob00st

+0

您能告诉我在一对多映射方面继承是如何帮助的吗? – Gob00st

+0

@ Gob00st:我根据您的更新进行了更新。 –

0

同桌是罚款。那么你有一些选择 - 如果你需要在同一张桌子内部进行区分 - 你可能会添加一个'类型'列 - 我认为你并不需要它,或者你建立关联类到其他东西,例如:

Doc_email 
---------- 
DocUUID 
EmailUUID 

Doc_letter 
----------- 
DocUUID 
LetterUUID 
+0

所以你反对在DocumentStore表中增加一个枚举类型?你是指什么联想班?你能详细说明你的例子吗?感谢 – Gob00st

+0

关联表将两个其他原子表链接在一起,而不会影响任何一个。对于枚举,我没有发现通常是必需的。尽管您没有指定您的业务规则,这可能是某种特殊情况。 – Randy

相关问题