【问题标题】:Should I normalize this database design further?我应该进一步规范这个数据库设计吗?
【发布时间】:2014-02-12 06:47:42
【问题描述】:

我有以下数据库设计:

TABLE [Document]
[DocumentId] [int] NOT NULL, --Primary Key
[Status] [bit] NULL,
[Text] [nvarchar](max) NULL,
[FolderPath] [nvarchar](max) NULL

TABLE [Metadata]
[MetadataId] [int] IDENTITY(1,1) NOT NULL, -- Primary Key
[DocumentId] [int] NOT NULL,               -- Foreign Key Document.DocumentId (1:1 relationship)
[Title] [nvarchar](250) NOT NULL,
[Author] [nvarchar](250) NOT NULL

TABLE [Page](
[PageId] [int] IDENTITY(1,1) NOT NULL,     -- Primary Key
[DocumentId] [int] NOT NULL,               -- Foreign Key Document.DocumentId (1:N Relationship)
[Number] [int] NOT NULL,
[ImagePath] [nvarchar](max) NULL,
[PageText] [nvarchar](max) NOT NULL

TABLE [Word](
[WordId] [int] IDENTITY(1,1) NOT NULL,     -- Primary Key
[PageId] [int] NOT NULL,                   -- Foreign Key Page.PageId (1:N Relationship)
[Text] [nvarchar](50) NOT NULL

TABLE [Keyword](
[KeywordId] [int] IDENTITY(1,1) NOT NULL,  -- Primary Key
[Word] [nvarchar](50) NOT NULL

TABLE [DocumentKeyword](
[Document_DocumentId] [int] NOT NULL,     -- Foreign Key Document.DocumentId  (N:N Relationship)
[Keyword_KeywordId] [int] NOT NULL        -- Foreign Key Keyword.KeywordId

我使用 Entity Framework Code First 来创建数据库。

我应该进一步规范我的数据库设计吗?即在文档和页面、文档和元数据等之间创建链接表?如果是这样,有没有办法让实体框架为我创建关系表,这样我就不必将它们包含在我的模型中?我正在努力学习以最正确和最有效的方式做到这一点。

谢谢。

【问题讨论】:

    标签: sql-server entity-framework visual-studio ef-code-first


    【解决方案1】:

    好吧,我无法立即回答您的问题,但我有一些想法可能会改进您的设计:

    1. 一个文档(至少在现实生活中)可以由多个人编写 作者。这意味着,您从 Document 到 元数据应该是 1:n 的关系(除非你能证明 永远不会有不止一个作者的情况)
    2. 文档的标题(在我看来)更多是文档的属性,而不是元数据(也考虑到 1.)
    3. 这个 Word 表格有什么作用?
    4. 如果您想在命名上保持一致,则应将 Keyword_KeywordId 列简单地称为 KeywordId。这同样适用于 Document_DocumentId。

    其余的看起来很正常

    【讨论】:

    • 1.我应该创建一个作者表吗?我还有其他字段,如收集器、所有者等。上面未显示。我是否需要为每个表创建表,或者我可以使用全部“人员”表吗? 3. 该数据库用于对文档进行 OCR 处理。单词表包含文档中单词的图像和位置。为了简洁起见,我省略了列。 4. 列名由实体框架自动创建。有没有办法指定一个具体的名字?
    • 我不能为你做决定,因为我不知道规范。如果每个文档允许多个作者,我想最好创建一个作者表。如果您只存储姓名和姓氏之外的更多信息,并且数据库中的所有其他人也是如此,那么您可以决定将表汇集在一起​​。但我个人会从将每种人建模为一个单独的实体开始。合并这些很容易,但拆分却不是。我不介意您使用哪种命名约定,但我只能建议让它保持一致。
    • 谢谢。我删除了“人”并将它们放在新表中。我不得不再做几处更改,但您的反馈有所帮助。
    猜你喜欢
    • 2017-10-04
    • 2020-05-08
    • 2011-02-06
    • 2010-11-18
    • 2018-07-08
    • 2018-01-27
    • 1970-01-01
    • 2011-07-17
    相关资源
    最近更新 更多