用于编译来自另一个表的记录的数据库设计

时间:2011-10-16 04:11:18

标签: c# sql sql-server

设计引用另一个表中多个记录的表的最佳方法是什么?

例如,有一个名为diary的表存储主题,描述和关键字,然后是另一个名为DiaryCompilation的表,用于通过引用日记中的id将所有选定的记录合并到一本书中。

创建DiaryCompilation的最佳方法是什么?

我想把它组成两个字段:id,references

所有选定的记录都放在参考文献中,但这是一种好的做法还是有更好的方法?

4 个答案:

答案 0 :(得分:0)

Diary和DiaryCompilation会有1对多的关系。只需确保将DairyCompilation中的Id设置为主键并对其设置外键约束,以便它与日记表中的Id绑定。这将阻止您删除日记并孤立DiaryCompilation表中的记录。只要你有一个标准化的数据模型,你应该没问题。

答案 1 :(得分:0)

<--- Each record is a new entry of diary --->
Diary: ID, Subject, Description, Keywords 

<--- Single record per compilation for summary info --->
DiaryCompilation: ID, Title 

<--- Pages of Diary Compilation --->
DiaryCompilationEntries: DiaryCompilationID, DiaryID

答案 2 :(得分:0)

保持你的领域是原子的。在references字段中放置多个值会使查询和强制引用约束变得更加困难。

父母与子女之间的1:N关系是通过将父母的主键迁移到子来建模的。在你的情况下,这看起来像这样:

COMPILATION (
    COMPILATION_ID         PK
    -- Other fields...
)

DIARY (
    DIARY_ID               PK
    COMPILATION_ID         FK(COMPILATION)
    SUBJECT
    DESCRIPTION
)

-- Not a good idea to have several keywords in a single field, so we need a separate table for keywords.
DIARY_KEYWORD (
    DIARY_ID               PK, FK(DIARY)
    KEYWORD                PK
)

如果你真的想要N:N关系(即日记可以是多个编辑的一部分),你需要一个专用的表来保存这些连接,如下所示:

COMPILATION (
    COMPILATION_ID         PK
)

DIARY_IN_COMPILATION (
    COMPILATION_ID         PK, FK(COMPILATION)
    DIARY_ID               PK, FK(DIARY)
)

DIARY (
    DIARY_ID PK
    SUBJECT
    DESCRIPTION
)

DIARY_KEYWORD (
    DIARY_ID               PK, FK(DIARY)
    KEYWORD                PK
)

答案 3 :(得分:0)

  

创建DiaryCompilation的最佳方法是什么?

听起来像最佳方式可能是使用视图而不是表格。