Ahm*_*mad 1 postgresql database-design
我有一个“文本”表,文本表可能来自不同的来源,如推文、短信、电子邮件等,每个来源都有自己的日志,文本来自来源。所以我提出了一些解决方案,但我不知道哪个是最好的。
解决方案1:
Text(
text_id PK
content
source_type (tweet, sms, email, etc)
source_id (can't be FK since it may contain sms_id, tweet_id, or email_id)
)
Tweet(
tweet_id PK
tweet_text
tweet_username
etc...
)
Sms(
sms_id PK
sms_text
sender_number
etc...
)
Email(
email_id PK
email_text
email_sender
etc...
)
Run Code Online (Sandbox Code Playgroud)
解决方案2:
Text(
text_id PK
content
sms_id FK
tweet_id FK
email_id FK
)
Tweet(
tweet_id PK
tweet_text
tweet_username
etc...
)
Sms(
sms_id PK
sms_text
sender_number
etc...
)
Email(
email_id PK
email_text
email_sender
etc...
)
Run Code Online (Sandbox Code Playgroud)
请注意,一个“文本”仅来自一个来源。
因此,如果我使用解决方案 2,假设来源来自短信,那么数据将如下所示
Text(
12
'the text'
333
null
null
)
Sms(
333
'the text'
0818833733664
etc...
)
Run Code Online (Sandbox Code Playgroud)
那么最好的方法是什么?
更新: 我错过了我的问题的很大一部分,这可能是错误的,抱歉。在我的情况下,文本也可能来自 csv(excel) 文件。这意味着一个文件可能有许多文本,因为该文件是许多文本(昏迷或行分隔)的转储。SMS、Tweet 和电子邮件与文本的关系是一对一的,但带有文本的文件是一对多的,所以我的问题中缺少的最大部分是文件表
File(
file_id PK
file_name
etc..
)
Run Code Online (Sandbox Code Playgroud)
我不喜欢你的两种解决方案。
我更喜欢的解决方案是@Joel Brown(有一些小改动)而不是“文本”,我将超类型称为“消息”,它不仅应该包含内容,还应该包含所有消息类型共有的所有字段(和引用)。
message(
message_id PK
content
common attributes ...
)
Tweet(
message_id PK, FK
tweet_username
tweet attributes
)
Sms(
message_id PK, FK
sender_number
sms attributes ...
)
Email(
message_id PK, FK
email_sender
email attributes ...
)
Run Code Online (Sandbox Code Playgroud)
实现很简单:每个实体都是一个表。超实体有一个主键。这个主键也用于子实体。如果您想使用与实体有关系的实体文本对系统进行建模sms
,email
并且tweet
如您的帖子所述,您将获得以下 EER 图
在您的特殊情况下,我不喜欢这种模型,但在其他情况下,这种模型是合适的。
有一种标准方法可以将这种 1:1 实体转换为表格。我们有三个关系sends
, mails
,tweets
它们有一个可选实体 ( SMS
, Email
, Tweet
) 和一个强制实体 ( Text
)。在这种情况下,外键存储在可选实体的表中。(你做错了)所以你得到以下表格
text(
text_id PK
content
other attributes ...
)
Tweet(
tweet_id PK
text_id FK
tweet_username
tweet attributes
)
Sms(
sms_id PK
text_id FK
sender_number
sms attributes ...
)
Email(
email_id PK
text_id FK
email_sender
email attributes ...
)
Run Code Online (Sandbox Code Playgroud)
使用扩展实体关系图(可能还有任何其他建模方法)几乎不可能在不欺骗您提出的此类解决方案的情况下创建。图表可以用铅笔和纸绘制。这篇文章中的图表是用DIA创建的。可以在TJTeorey、D.Yang、JPFry: A Logical Design Methodology for Relational Databases Using the Extended Entity-Relationship Model 中找到扩展实体关系模型以及如何将其传输到表中