【问题标题】:DB Design, To normalize or not?数据库设计,是否规范化?
【发布时间】:2013-11-14 16:55:26
【问题描述】:

使用 MS Visual Studio 2012、Asp.net C# MVC 4、实体框架、NopCommerce(cms)

大家好,我有数据库设计查询,它实际上让我很困惑,通常我对 DB 没有任何问题。

然而,自从过渡到 Code First 方法之后,我问了自己这个问题......

我正在为我的 NopCommerce CMS 网站创建一个新插件,该插件应为 ImageGallery 插件

我希望数据层存储一个

ID,
Name,
LargeImg
SmallImg,
Urlimg

但我也想实现这个插件的功能,用户应该能够上传任何图像,然后将该图像关联到那里选择的部分,我的意思是Img到博客文章,或图片到新闻文章,图片到产品文章或所有 3。

现在这三个示例是我能想到的唯一示例,但正如您已经猜到的,这可能会根据其他内容类型而改变。

现在我立刻想到,很简单,我们只需创建一个名为.....Type 的字段?还是内容类型? 然后,此字段将存储图像关联的“类型”,无论是博客、新闻还是产品项。

此时我想到了“但是如果一个图像有多个关联呢?

这让我想到了这个问题,在这种情况下,我应该:

  • 为每个“内容类型”(非规范化)创建单独的列
  • 创建1列称为“内容类型”(规范化)
  • 创建一个完全单独的表称为“内容类型”并使用关系

由于某种原因,我被卡住了,我通常不会对数据库设计和实现持空白。

下面的代码是我插件中的域类,我选择了 number 2,但我不确定是否会继续走这条路。

using Nop.Core;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Hroc.Plugin.Misc.ImageGallery.Domain
{
    public class ImageItem : BaseEntity
    {
        public virtual int ImageID { get; set; }
        public virtual string Name { get; set; }
        public virtual byte[] Largeimg { get; set; }
        public virtual byte[] Smallimg { get; set; }
        public virtual string URLimg { get; set; }
        public virtual string Typeimg { get; set; }
        public virtual int LinkID { get; set; }
    }
}

希望你们能指出正确的实现方法,谢谢!

【问题讨论】:

    标签: c# asp.net-mvc-4 database-design entity-framework-4 nopcommerce


    【解决方案1】:

    凡事都有取舍

    在您的情况下标准化的好处:

    • 可扩展性 - 添加其他内容类型不需要更改结构/类
    • 较小的表(对于可变长度数据,差异可能不显着)

    缺点:

    • 查询 - 如果您需要在一个查询中提取多种类型,则需要去规范化。
    • 完整性开销 - 如果管理不当,可能会出现孤立数据

    如果我正在设计此功能,我会选择选项 3 - 标准化内容类型还有其他优势,例如能够将该表用于下拉列表。

    【讨论】:

    • 简单的答案,干净的建议!我同意标准化的优势通常胜过其他任何事情。在规范化的同时为内容类型创建一个单独的实体似乎是最好的解决方案,尽管正如你所说的那样,查询并不让我担心,但是完整性开销是一个令人担忧的问题,在这种情况下规范化似乎会产生复杂的可能性,你会说什么是最佳可管理解决方案?我错过了一个吗?还是您仍会坚持选择 3 作为更好的邪恶?
    • 我会坚持使用选项 3,只管理参照完整性。