【问题标题】:DB: How to set up a many to many table(s) to handle multiple selectable conditionsDB:如何设置多对多表来处理多个可选条件
【发布时间】:2018-04-03 18:12:18
【问题描述】:

我正在为一个网站开发一个搜索过滤器,该过滤器将帮助用户找到满足他们需求的场所(用于聚会和仪式)。过滤器将包括以下内容:风格、便利设施、活动类型等。一个类别中的多个选项可以应用于场地,因此用户可以在搜索时从风格、便利设施和活动类型类别中选择多个选项。

我的问题是我应该如何处理数据库中的表设计。目前,我有一个带有唯一 ID 和基本信息的 Venue 表,以及一些代表每个类别(样式、设施等)的表,其中包含一个 ID 和名称字段。

我知道我需要一个中间表来保存外键,因此适用于类别的每个选项都与场所相关联。

选项 1:为每个类别表创建一个多对多中间表,其中包含该类别和场所的外键。

选项 2:为每个类别以及地点创建一个带有外键的大型中间表 即

fk_venue

fk_style

fk_amenities

...

我正在尝试确定在编码方面什么更有效且问题更少。选项 1 需要对每个表进行查询,这可能会变得难以处理,而选项 2 似乎更容易查询,但可能有更多的记录来处理具有许多便利设施和活动类型的场地。

这似乎不是一个新问题,但我很难找到详细说明如何最好地解决这个问题的资源。我们目前正在为数据库使用 MSSQL,并正在使用 .net 核心构建站点。

【问题讨论】:

    标签: sql sql-server rdbms


    【解决方案1】:

    选择选项一。创建一个连接表来记录场地每个可用特征的多对多关系。选项2在存储方面非常浪费。考虑这样一种情况,您的场地只有一个便利设施,当有 50 种便利设施类型可用时。另外,据我了解,您对选项 2 的建议是,每次添加 amenity、event_type 或样式时,您都必须更新数据库设计。明智地支持这将是一件非常困难的事情。

    在选项 1 的情况下,一些表格将是:

    Table Name: venue_amenities 
    Columns: venue_id, amenity_id
    
    Table Name: venue_event_types
    Columns: venue_id, event_type_id
    
    Table Name: venue_styles
    Columns: venue_id, style_id
    

    当您使用过滤器查询所有内容时,您可以这样查询:

    select distinct
    v.venue_id
    from venues v
    inner join venue_amenities va on v.venue_id = va.venue_id
    inner join venue_event_types vet on v.venue_id = vet.venue_id
    inner join venue_styles vs on v.venue_id = vs.venue_id
    where va.amenity_id in ([selected amenities])
    and vet.event_type_id in ([selected event types])
    and vs.venue_style in ([selected styles])
    

    【讨论】:

      【解决方案2】:

      选项 3:您可以从元数据设计开始。这将允许您为每个项目或实体拥有多个记录。

      这些事情通常会随着任务的发展、流程的发展和数据的学习或客户对随着时间推移提取的一些更精细的细节的理解而发展。

      我看到过类似的事情,人们为标签或白名单设计,搜索可能会让你更接近你正在寻找的东西。这是一个帮助您入门的工作示例。

      declare @venue as table(
          VenueID int identity(1,1) not null primary key clustered
      ,   Name_ nvarchar(255) not null
      ,   Address_ nvarchar(255) null
      );
      
      declare @venueType as table (
          VenueTypeID int identity(1,1) not null primary key clustered
      ,   VenueType nvarchar(255) not null
      );
      
      declare @venueStuff as table (
          VenueStuffID int identity(1,1) not null primary key clustered
      ,   VenueID int not null -- constraint back to venueid
      ,   VenueTypeID int not null -- constraint to dim or lookup table for ... attribute types
      ,   AttributeValue nvarchar(255) not null
      );
      
      insert into @venue (Name_)
      select 'Bob''s Funhouse'
      
      insert into @venueStuff (VenueID, VenueTypeID, AttributeValue)
      select 1, 1, 'Scarrrrry' union all
      select 1, 2, 'Food Avaliable' union all
      select 1, 3, 'Game tables provided' union all
      select 1, 4, 'Creepy';
      
      insert into @venueType (VenueType)
      select 'Haunted House Theme' union all
      select 'Gaming' union all
      select 'Concessions' union all
      select 'post apocalyptic'; 
      
      select a.Name_
           , b.AttributeValue
           , c.VenueType
        from @venue a
        join @venueStuff b
          on a.VenueID = b.VenueID
        join @venueType c
          on c.VenueTypeID = b.VenueTypeID
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-02-17
        • 1970-01-01
        • 2015-05-19
        • 2013-01-01
        • 1970-01-01
        • 2021-12-26
        • 2011-12-06
        相关资源
        最近更新 更多