mysql - 我应该选择带有 NULL 值的大表还是非 NULL 多表设计?

标签 mysql sql optimization query-optimization

在下表中:http://sqlfiddle.com/#!9/a28b23/6/0

我应该选择哪种最佳设计?

大设计:

##BIG_ONE //ALL
SELECT * FROM  bigdocs ;

##BIG_ONE //18+
SELECT * FROM  bigdocs  WHERE age >= 18;

##BIG_ONE //18-
SELECT * FROM  bigdocs  WHERE age < 18;

或者多合一设计:

##MULTI-ONE //ALL
SELECT * FROM  docs_18 
UNION ALL
SELECT  id ,  name ,  age , NULL, NULL FROM  docs ;

##MULTI-ONE //18+
SELECT * FROM  docs_18 ;

##MULTI-ONE //18-
SELECT * FROM  docs ;

##MULTI-ONE //18-
SELECT * FROM docs;

每个查询都呈现单一用途,而不是一次性使用,我应该采用哪种更好的设计?

最佳答案

首先要考虑的是每行是否代表不同的实体。也就是说,如果您有外键关系,您是否希望为 18 岁以下人群与其他人建立单独的关系。

我猜您希望与任何人建立外键关系,无论其年龄如何。例如,您可能有一个单独的表,其中包含一个人所说的语言、一个人使用的昵称、一个人拥有的宠物、一个人用户的电子邮件等等。这些都与人们有关,无论他们的年龄如何。

这强烈建议使用一张表。

您可能想要做的是在 table 上为每组人员提供一个 View 。出于性能原因,您甚至可以按年龄组对表进行分区。

但是,没有先验理由将一个完全合理的实体拆分为两个不同的表。

一个重要的考虑因素是两个组是否有不同的安全要求。在表级别通常比在行级别更容易实现安全性,因此这将是一个考虑因素(尽管问题根本没有建议)。

关于mysql - 我应该选择带有 NULL 值的大表还是非 NULL 多表设计?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49097298/

相关文章:

mysql - 加快MYSQL中的自连接

MySQL 错误 1264 : out of range value for column

c++ - std::string const& 参数是否复制传递的 const char* ?

r - 如何优化递归函数来查找所有排列?

php - MySQL数据库无法识别从Excel文件(xls)中提取的汉字

mysql - SQL 跟踪器记录表中的更改

sql - 在函数内引用打开的数据库连接 - Golang

php - 我收到此错误代码 : Invalid argument supplied for foreach()

c# - 优化代码: Linq and foreach loop 15k records

php - 在 mysql 数据库中存储大量数字的问题