Mysql sql表设计用于获取具有多个包含和排除条件的记录

Mysql sql表设计用于获取具有多个包含和排除条件的记录,mysql,sql,database-design,Mysql,Sql,Database Design,我们希望根据以下参数选择客户,即客户应在: 特定城市,即城市ID=1,2,3 应排除特定的customerId,即customerId=33232334534 具体年龄,即5岁、7岁、72岁 此包含和排除列表可以任意长 我们应该如何为此设计数据库: 为这些包含城市创建单独的表“customerInclusionCities”,并执行以下操作: 选择*from customers where cityId in从customerInclusionCities中选择cityId 对于年龄,我们会创建

我们希望根据以下参数选择客户,即客户应在:

特定城市,即城市ID=1,2,3

应排除特定的customerId,即customerId=33232334534

具体年龄,即5岁、7岁、72岁

此包含和排除列表可以任意长

我们应该如何为此设计数据库:

为这些包含城市创建单独的表“customerInclusionCities”,并执行以下操作: 选择*from customers where cityId in从customerInclusionCities中选择cityId

对于年龄,我们会创建表“CustomerLigibleAge”,其中包含符合条件的年龄项目的所有项目:

i、 e.从客户中选择*,其中年龄在CustomerLigiblePage中选择年龄

并为排除客户创建单独的表“customerIdToBeExcluded”:

i、 e.从customerId不在的客户中选择*从customerId中选择customerId排除

创建一个带有类别和ID的表。 i、 e.城市1类,客户ID 2类除外。
哪种方法更好,为这些参数创建一个表,还是为每个列表(即年龄、客户ID、城市)创建单独的表?

如果您仅使用该操作的数据库,我建议使用第一种解决方案。而且,第一个解决方案部署起来非常简单

第二个解决方案填充了数据库中的垃圾。

在选择中。。。可能会很慢。以单选方式执行查询,而不使用子查询。我假设所有3列都在同一个表中?如果不是,那就增加了复杂性。WHERE子句可能有3个IN常量子句:

至少有:

INDEX(cityId),
INDEX(age)
否定的事物不太可能使用索引

查询将使用其中一个索引;两者兼而有之将使优化器有一个它认为更好的选择

或者

建议索引可能作为主键:


为了进一步讨论,请提供每个表的显示创建表,并解释选择。。。对于任何一个实际有效的查询。

你有没有尝试过构建星型模式?我忘了提到我们希望CityID、CustomerID、age的列表是可配置的,因此我们将它们保存在表中,而不是直接用SP编写。你的客户机语言是什么?我们使用的是mysqlPHP?JAVA没有密码?如果没有代码,那么长长的customerid列表从何而来?调用此SP的是C。
INDEX(cityId),
INDEX(age)
SELECT c.*
    FROM customers AS c
    JOIN cityEligible AS b  ON b.city = c.city
    JOIN customerEligibleAge AS ce  ON c.age = ce.age
    LEFT JOIN customerIdToBeExcluded AS ex ON c.customerId = ex.customerId
    WHERE ex.customerId IS NULL
customers: (city)
customerEligibleAge: (age)
customerIdToBeExcluded: (customerId)