В следующих таблицах: http://sqlfiddle.com/#!9/a28b23/6/0
С каким дизайном лучше всего пойти?
Дизайн Big-One:
##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 Design:
##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 лет против всех остальных.
Я бы предположил, что вы хотите, чтобы отношение внешнего ключа было для кого угодно, независимо от возраста. Например, у вас может быть отдельная таблица языков, на которой говорит человек, прозвища, которые использует человек, домашние животные, которыми владеет человек, отправляет письма пользователям пользователей и т.д. Они будут относиться к людям независимо от их возраста.
Это настоятельно предлагает одну таблицу.
То, что вы можете сделать, - это посмотреть на таблицу для каждой группы людей. Вы можете даже разбивать таблицу по возрастным группам по соображениям производительности.
Но нет априорной причины разделить совершенно разумную сущность на две разные таблицы.
Одно важное соображение заключается в том, что две группы имеют разные требования безопасности. Безопасность часто проще применять на уровне таблицы, чем на уровне строк, поэтому это будет рассмотрение (хотя и не предлагаемое вопросом).
bigdocs
, если у него есть миллионная запись, он все равно был бы так же быстр, как одиночный запросdocs_18
если бы у меня былIndex
поage
и я использовалWHERE age >= 18
? В целом, я забочусь о производительности больше всего.