SQL Server表设计;一个表类型列与多个表

时间:2016-04-07 07:41:47

标签: sql sql-server database

我创建了一个网站,其中包含博客和产品页面。帖子和产品存储在不同的表格中。我用的是microsoft sql server。

我想创建一个表来存储每个帖子和每个产品的视图。我的两个可能的设计是:

  1. 所有观点的一个表

    (id, ref_id, date, ip, type) 
    

    其中type是post或product

  2. 两个单独的表,表post_views和表product_views

    post_views(id, post_id, date, ip)
    product_views(id, product_id, date, ip)
    
  3. 哪种设计更好,为什么?

    我的推理:

    解决方案1需要更多的数据库空间(我们需要存储每个视图的类型值),还需要更多的复杂"查询。我们需要按id和类型进行搜索。

    解决方案1更紧凑。我们有更少的牌桌,但表现不会那么好。如果我们有100万条记录,500k个视图用于帖子,500k视图用于产品,我们必须搜索所有视图按日期过滤(仅举例) 第一个解决方案的优点是紧凑性,我少用一张桌子。

    第二个解决方案需要多一个表,但查询性能和磁盘空间会更好。

    这是我面临的一个非常常见的设计问题,我很乐意收到一位非常优秀的专家的回答。

2 个答案:

答案 0 :(得分:2)

由于帖子和产品都有自己的表格,因此请使用第二个选项 - 表示帖子视图和产品视图的不同表格。

这是一个更好的选择的原因是此选项允许您在视图表和帖子和产品表之间使用外键,并保持帖子和产品分开。

第一个选项还允许您在这些表之间使用外键,但这意味着您只能在帖子和产品表中发布ref_id所在的视图。此外,它将强制更麻烦的select语句包含基于类型列的不同连接。

答案 1 :(得分:0)

由于没有您提供的信息,我会选择第一个选项,因为它更简洁。除非你有令人信服的理由将它们分成两个表,否则你应该把它们放在一个表中。根据需要,按类型过滤任何查询都很容易。

另一个考虑因素是,存储过程中更常见的做法是拥有一个变量字段参数(例如你的类型字段),而不是拥有一个变量表名,所以任何存储过程的函数都是你的如果你把它们放在一张桌子里,对你来的人来说,创造会更加明显。

相关问题