MySQL - Оптимизация ссылок на столбцы? - PullRequest
0 голосов
/ 04 октября 2011

Я испытываю затруднения, пытаясь сформулировать реальный вопрос, который у меня есть, так что, надеюсь, я смогу разобраться в этом с помощью визуальной помощи.

Что меня интересует, так это ужасен мой нынешний дизайн базы данныхнекорректный, немного неэффективный или ... правильный.

В: Есть ли лучший способ для ячейки строки ссылаться на столбец в другой таблице, кроме простого сохранения строки с именем этого столбца?

Пример: есть две таблицы.

table01: имеет 3 столбца - c_id, customer, tier ( tier содержит имя столбца уровня в table02 )

table02: имеет 5 столбцов - i_id, item, tier1, tier2, tier3

table01 +------+----------+------+
        |'c_id'|'customer'|'tier'|
        +------+----------+------+
        |   1  | John     | tier1|
        |   2  | Lisa     | tier2|
        |   3  | Mike     | tier1|
        |   4  | Tom      | tier3|
        +------+----------+------+

table02 +------+------+-------+-------+-------+
        |'i_id'|'item'|'tier1'|'tier2'|'tier3'|
        +------+------+-------+-------+-------+
        |   1  | apple| $1.99 | $2.99 | $3.99 |
        |   2  | chalk| $2.99 | $3.99 | $4.99 |
        |   3  | pens | $3.99 | $4.99 | $5.99 |
        |   4  | shirt| $4.99 | $5.99 | $6.99 |
        +------+------+-------+-------+-------+

Результат:

John    +------+-------+
        | apple| $1.99 |
        | chalk| $2.99 |
        | pens | $3.99 |
        | shirt| $4.99 |
        +------+-------+

При выборе строки Джона будет получен уровень 1, которыйзатем используется для запроса table02.tier1 и получения содержимого этого столбца.(При этом снижены цены для клиентов уровня 1).В этом случае элементы уровня 1 будут отображаться с их правильными ценами.

Существует ли более эффективный способ ссылки на имя столбца внешней таблицы, например ... в стиле внешних ключей?Где, если имя столбца изменится, тогда эта информация попадет в другие связанные ячейки данных? Верен ли мой подход или мне следует изменить структуру своей работы?

1 Ответ

1 голос
/ 04 октября 2011

Не совсем понятно, как предполагается использовать столбцы c_id и i_id, но более традиционным дизайном было бы использование такого дизайна:

table01 +------+----------+------+
        |'c_id'|'customer'|'tier'|
        +------+----------+------+
        |   1  | John     |  1   |
        |   2  | Lisa     |  2   |
        |   3  | Mike     |  1   |
        |   4  | Tom      |  3   |
        +------+----------+------+

table02 +------+------+-------+
        |'i_id'|'tier'|'cost' |
        +------+------+-------+
        |   1  |   1  | $1.99 |
        |   2  |   1  | $2.99 |
        |   3  |   1  | $3.99 |
        |   4  |   1  | $4.99 |
        |   1  |   2  | $2.99 |
        |   2  |   2  | $3.99 |
        |   3  |   2  | $4.99 |
        |   4  |   2  | $5.99 |
        |   1  |   3  | $3.99 |
        |   2  |   3  | $4.99 |
        |   3  |   3  | $5.99 |
        |   4  |   3  | $6.99 |
        +------+------+-------+

Я отредактировал пример, чтобы лучше проиллюстрировать свои мысли.Что на самом деле не сильно меняет ваш ответ.Так что было бы лучше объединить столбцы уровня в один столбец и просто повторить данные id элемента (i_id) несколько раз?Моим аргументом в пользу разбиения структуры уровня / затрат на столбцы было сокращение избыточности.Требует ли этот подход от меня создания новой таблицы для индексации уровней для внешних ключей?

Я понимаю, что вы делаете сейчас.Где-то вдоль линии у вас может быть таблица «Продажи», в которой записаны c_id и i_id, количество, дата и другая такая информация (если каждая продажа состоит из одного предмета; в противном случае у вас будетТаблица 'Orders' и 'OrderItems', а также c_id будут связаны с таблицей заказов, а i_id будет связан с позициями заказов, и будет номер заказа для соединения двух таблиц).

Если вы добавите свое item описание к пересмотренному table02 выше, вы нарушите 3NF.У вас должна быть таблица типа «Продукты» со столбцами i_id и item.Это дало бы имена номерам предметов.Таблица table02 (возможно, 'TieredItemCosts'), которую я предложил, останется без изменений;первичный ключ - это комбинация (i_id, tier).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...