C# 我应该将所有数据放在一个表中以实现过滤还是使用连接表

C# 我应该将所有数据放在一个表中以实现过滤还是使用连接表,c#,sql,sql-server,database-design,filtering,C#,Sql,Sql Server,Database Design,Filtering,我考虑使用连接表来避免重复数据库中的数据 所以我有下面的模式 公寓: +--+----+-----+---------+ |ID |价格|城市ID |合同类型ID | +--+----+-----+---------+ | 1 | 200 | 1 | 1 | | 2 | 150 | 1 | 2 | | 3 | 400 | 1 |

我考虑使用连接表来避免重复数据库中的数据

所以我有下面的模式

公寓:

+--+----+-----+---------+ |ID |价格|城市ID |合同类型ID | +--+----+-----+---------+ | 1 | 200 | 1 | 1 | | 2 | 150 | 1 | 2 | | 3 | 400 | 1 | 2 | +--+----+-----+---------+ 设施类型:

+--+-------+ |身份证|姓名| +--+-------+ |1 |建筑| |2 |厨房| |3 |家具| +--+----+---+ 便利设施:

+--+-----+-------+ |ID | TypeID | Name | +--+-----+-------+ |1 | 1 |安全| |2 | 1 |停车| |3 | 2 |冰箱| +--+-----+-------+ 公寓设施:

+-------+------+ |公寓ID|Amentityid| +-------+------+ | 1 | 1 | | 1 | 2 | | 2 | 1 | | 2 | 2 | | 2 | 3 | +-------+------+ 我现在的问题是,如何应用一些过滤器,例如,我需要CityID 1的所有公寓,价格<400,有冰箱和安全装置

这也是实现我想要做的事情的最佳方法

预期结果:

公寓编号:2,建筑特征:安全,厨房特征:冰箱

更新:我目前的工作方法


注意:我在这里发布的数据库中使用了不同的数据,但我的重点是方法

你可以在你的便利设施上使用过滤器,然后对每个公寓进行分组,并检查是否所有过滤器都满足要求。然后回到你的公寓,加入额外的过滤器。像这样的

您可以参考这些链接了解更多信息


公寓与城市的联系是什么?阅读不同的类型。如果我没有包括整个模式,很抱歉,但我想为我集中精力于复杂的部分。Cities位于一个单独的表中,与公寓保持正常的1:M关系。非常感谢您的帮助,但我对此有所了解,这不是我第一次,但我已经生锈很长时间了,我需要帮助来解决这个问题。好的,我试图应用您的代码,但我遇到了错误:Msg 4104,级别16,状态1,第7行多部分标识符AA.AmenityID无法绑定。我尝试了几件事情,其中一件对我有效,我更新了我的问题,建议我的方法是否正确,这将是很有帮助的,在您的示例ApartmentComforces表的AmentityID列中。数据库中的列是否也具有相同的名称?@e7naonline-添加了一个sql FIDLE。如果您的模式或命名约定不同,您可以使用上面的逻辑并适当地修改它。我想简化我的问题,所以我使用了不同的名称,我的不好。我修正了我的打字错误,一切都很好。1-第一个WHERE子句生成错误。数据类型text和varchar在equal to运算符中不兼容。所以我用LIKE操作符替换了它。2-将条件结果作为操作数数据类型文本对于1,2中的count运算符.PropertyMinities.AmentityId无效,这并不保证相关单元将同时具有两个AmentityId 1,2。即使一套公寓的舒适度=1,它仍然会出现在你的结果中。你的问题是带余数的关系除法的一个例子。查看此帖子
SELECT Price, ID, Amenities.Name as 'Amenity' FROM Apartments
INNER JOIN ApartmentAmenities ON ApartmentAmenities.ApartmentID = Apartments.ID
INNER JOIN Amenities ON ApartmentAmenities.AmenityID = Amenities.ID

WHERE PropertyAmenities.AmenityID IN (1,2) AND Apartments.Price < 300 AND CityID=1
SELECT AP.ID
FROM Apartments AP
INNER JOIN 
(
    SELECT AA.ApartmentID
    FROM ApartmentAmenities AA
    INNER JOIN Amenities A ON A.ID = AA.AmenityID
    INNER JOIN AmenityTypes AT ON AT.ID = A.TypeID
    WHERE (AT.Name = 'Kitchen' AND A.Name = 'Fridge') OR (AT.Name = 'Building' AND A.Name = 'Security')
    GROUP BY AA.ApartmentID
    HAVING COUNT(DISTINCT A.Name) = 2
)AA 
ON AP.ID = AA.ApartmentID
WHERE CityID = 1 AND  Price < 400