Я новичок в SQL, и думать о своих наборах данных реляционно, а не иерархически - это большой сдвиг для меня. Я надеюсь получить представление о производительности (как с точки зрения объема хранилища, так и скорости обработки), а также сложности дизайна использования числовых идентификаторов строк в качестве первичного ключа вместо строковых значений, которые имеют более значимый смысл.Каковы достоинства использования числовых идентификаторов строк в MySQL?
В частности, это мое положение. У меня есть одна таблица («родительская») с несколькими сотнями строк, для которой один столбец является строковым идентификатором (10-20 символов), который, по-видимому, является естественным выбором для первичного ключа таблицы. У меня есть вторая таблица («ребенок») с сотнями тысяч (или, возможно, миллионов или более) строк, где каждая строка ссылается на строку в родительской таблице (чтобы я мог создать ограничение внешнего ключа для дочерней таблицы). (На самом деле, у меня есть несколько таблиц обоих типов со сложным набором ссылок среди них, но я думаю, что это имеет смысл.)
Так что мне нужен столбец в дочерней таблице, который дает идентификатор строкам в родительская таблица. Наивно, кажется, что создать столбец как нечто вроде VARCHAR (20), чтобы ссылаться на «естественный» идентификатор в первой таблице, приведет к огромному успеху в производительности как с точки зрения пространства для хранения, так и времени запроса, и поэтому я должен включить числовой (вероятно, auto_increment) столбец id в родительской таблице и использовать его как ссылку в дочернем элементе. Но поскольку данные, которые я загружаю в MySQL, уже не имеют таких числовых идентификаторов, это означает увеличение сложности моего кода и больше возможностей для ошибок. Хуже того, так как я занимаюсь поисковым анализом данных, я могу захотеть смеяться со значениями в родительской таблице, не делая ничего с дочерней таблицей, поэтому я должен быть осторожным, чтобы случайно не разорвать отношения на удаляя строки и теряя мой числовой идентификатор (я бы, вероятно, решил это, сохранив идентификаторы в третьей таблице или что-то глупое подобное.)
Итак, мой вопрос в том, есть ли оптимизации, которые я, возможно, не знал об этом колонка с сотнями тысяч или миллионов строк, повторяющая несколько сотен строк, снова и снова менее расточительна, чем кажется на первый взгляд? Я не против скромного компромисса эффективности в пользу простоты, поскольку это для анализа данных, а не для производства, но я беспокоюсь, что я закоучу себя в угол, где все, что я хочу сделать, занимает огромное количество времени бежать.
Заранее спасибо.
С правильными индексами «производительность» в значительной степени «не имеет значения» - накладные расходы являются постоянными. Таким образом, рассмотрите вопрос с точки зрения неэффективности. – user2864740
Возможный дубликат [Surrogate vs. natural/business keys] (http://stackoverflow.com/questions/63090/surrogate-vs-natural-business-keys) – Mitch
1) Ваш внешний ключ не обязательно должен быть на вашем первичный ключ. 2) Если у вас есть отношения «один-ко-многим» (один родитель с большим количеством детей), колонка внешнего ключа вашего ребенка _definitely_ не должна автоматически увеличиваться. 3) ограничение внешнего ключа может иметь что-то вроде RESTRICT или CASCADE, чтобы избежать случайных ошибок, в зависимости от того, что именно вы будете делать. –