Стол без ПК - PullRequest
       16

Стол без ПК

0 голосов
/ 08 июня 2011

У меня есть таблица предметов со стойкой в ​​определенный период времени, ровно одна неделя, и мне нужно составить таблицу рангов недели запроса, например:

Items
-----
id 
name

И:

Item_in_rank
------------
item_id -> Items.id
year
week
rank

если я сделаю:

SELECT
    r.rank,
    i.*
FROM
    Item_in_rank AS r 
INNER JOIN
    Items AS i
       ON r.item_id = i.id
WHERE
    week = 4 AND year = 1986
ORDER BY
    r.rank ASC

Я получу рейтинг:

rank id  name
1-    4  jhon
2-   76  jorge
3-   21  myriam
4-   92  bety

Я могу получить один раз в разные недели / годы, когда бы я ни получилсписок.Мне не нужен ПК в этой модели, но правильно ли это?

Если я определяю как ПК (неделя, год), я не могу иметь:

week year item rank
  1  1980   41    1
  1  1980   32    2
etc..

, если яопределите как pk (неделя, год, элемент), для которого нужно создать индекс (неделя, год), и pk будет бесполезным.

Это правильно?или я не прав?

Ответы [ 3 ]

1 голос
/ 09 июня 2011

если я определю как pk (неделя, год, элемент), то я необходимо создать индекс для (неделя, год), и ПК будет бесполезно.

Добавление столбца к индексу увеличивает индекс (плохо), но не делает его менее полезным. MySQL может использовать индекс на (col1, col2) для поиска на col1. Поэтому непременно измените свой первичный ключ на (week, year, item).

В качестве примера индекса, который не будет работать: если ваш первичный ключ - (col1, col2), то MySQL не сможет использовать его для поиска col2. Это было бы похоже на использование телефонной книги, отсортированной по lastname, firstname, для поиска имени.

Это правильно? или я не прав?

Вы ошибаетесь! :)

1 голос
/ 08 июня 2011

Тебе всегда нужен ПК, особенно когда ты думаешь, что нет.Цель PK - гарантировать, что вы всегда сможете однозначно идентифицировать запись.Это не является обязательным для базы данных для правильной работы (попробуйте удалить дубли, если у вас нет ПК, и если у вас его нет, есть 100% вероятность, что у вас будут дублирования), и это не означает, что вам может не понадобитьсяи другие индексы.

0 голосов
/ 09 июня 2011

Во многих базах данных (я не уверен насчет mysql) PK больше похож на ограничение на таблицу. Другими словами, таблица - это ПК. Данные хранятся в порядке PK, но не значительно больше из-за PK.

Попробуйте добавить PK и посмотрите, увеличивается ли размер хранилища данных. Добавьте вторичный индекс (для которого может потребоваться PK), чтобы ваш запрос работал правильно.

Не беспокойтесь о создании бесполезного ПК. Попробуйте сами, чтобы понять, стоит ли это создавать.

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