数据库设计,规范化与否?

时间:2013-11-14 16:55:27

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

使用MS visual studio 2012,Asp.net C#MVC 4,实体框架, NopCommerce(cms)

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

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

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

我希望数据层存储

ID,
Name,
LargeImg
SmallImg,
Urlimg

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

现在这三个例子是我能想到的唯一例子,但正如你猜测的那样,这可能会因其他内容类型而改变。

现在我想,我们简单地创建一个名为..... Type的字段?或ContentType? 然后,该字段将存储图像关联的“类型”,无论是博客,新闻还是产品项目。

此时我想到了“但如果图像有多个关联怎么办?

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

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

出于某种原因,我被困住了,我通常不会在数据库设计和实现上留下空白。

以下代码是我的插件中的域类,我选择 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; }
    }
}

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

1 个答案:

答案 0 :(得分:1)

任何事情都需要权衡

您案件中正常化的好处:

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

缺点:

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

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