Вопрос

Я предполагаю, что это полукоммунный вопрос, но я не могу найти его в списке прошлых вопросов. У меня есть набор таблиц для продуктов, которые необходимо поделиться первичным индексом ключей. Предположим что -то вроде следующего:

product1_table:
    id,
    name,
    category,
    ...other fields

product2_table:
    id,
    name,
    category,
    ...other fields

product_to_category_table:
    product_id,
    category_id

Очевидно, было бы полезно иметь общий индекс между двумя таблицами продукта. Обратите внимание, что идея держать их в отделении заключается в том, что они имеют в основном разные наборы полей за пределами основ, однако они имеют общую категоризацию.

ОБНОВИТЬ:

Многие люди предложили наследование таблицы (или Gen-Spec). Это вариант, который я знаю, но приведен в других системах баз данных, я мог бы поделиться последовательности между таблицами, которые я надеялся, у MySQL было аналогичное решение. Я предполагаю, что это не основано на ответах. Думаю, мне придется пойти с наследством стола ... спасибо всем.

Это было полезно?

Решение

Это не совсем распространено, нет. Там нет местного способа поделиться первичным ключом. Я мог бы сделать в вашей ситуации:

product_table
    id
    name
    category
    general_fields...

product_type1_table:
    id
    product_id
    product_type1_fields...

product_type2_table:
    id
    product_id
    product_type2_fields...

product_to_category_table:
    product_id
    category_id

То есть есть одна таблица основного продукта, которая имеет записи для всех продуктов и имеет поля, которые обобщаются между типами, и таблицы, определенные типом, с иностранными ключами в таблицу основных продуктов, которые имеют специфичные для типа данных.

Другие советы

Лучшим дизайном является размещение общих колонн в таблицу одной продукции и специальные столбцы в двух отдельных таблицах. Используйте Product_ID в качестве основного ключа во всех трех таблицах, но в двух специальных таблицах он, кроме того, иностранный ключ обратно в таблицу основных продуктов.

Это упрощает базовый поиск продукта для идентификаторов и имен по категории.

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

Кажется, вы ищете наследство стола.

Вы можете использовать общую таблицу product с атрибутами, общими как для Product1, так и для Product2, плюс type атрибут, который может быть либо "product2" или же "product1"

Затем таблицы product1 а также product2 будут иметь все их конкретные атрибуты и ссылка на родительский стол product.

product:
    id,
    name,
    category,
    type

product1_table:
    id,
    #product_id,
    product1_specific_fields

product2_table:
    id,
    #product_id,
    product2_specific_fields

Сначала позвольте мне заявить, что я согласен со всем, что говорили Хаос, Ларри и Фил.

Но если вы настаиваете на другом пути ...

Есть две причины для вашего общего PK. Одна уникальность в двух таблицах и две для завершения референциальной целостности.

Я не уверен, что именно то, что «последовательность» имеет поддержку поддержки столбцов Auto_Increment. Похоже, есть системные настройки Чтобы определить увеличение по значению, но ничего на столбец.

То, что я бы сделал в Oracle, просто разделяет одну и ту же последовательность между двумя таблицами. Другой метод - установить значение шага 2 в AUTO_INCREMENT и запустить один в 1, а другой - 2. В любом случае, вы генерируете уникальные значения между ними.

Вы можете создать третью таблицу, в которой нет ничего, кроме столбца PK. Этот столбец также может обеспечить аутонобеблону, если нет способа создать пропусков AutoNumber в одном сервере. Затем в каждой из ваших таблиц данных вы добавите триггеры CRUD. Вставка в любую таблицу данных сначала инициирует вставку в таблицу псевдо -индекса (и вернет идентификатор для использования в локальной таблице). Аналогично удаление из локальной таблицы инициирует удаление из таблицы псевдо -индекса. Любые детские таблицы, которые должны указывать на родительскую точку на эту таблицу псевдо -индекса.

Обратите внимание, что это должно быть запуска на строку и замедлит CRUD на этих таблицах. Но такие таблицы, как «продукт», как правило, не имеют очень высокого уровня DML в первую очередь. Любой, кто жалуется на «воздействие на производительность», нет Учитывая шкалу.

Обратите внимание, что это предоставляется как функционирующая альтернатива, а не моя рекомендация как Лучший путь

Вы не можете «поделиться» первичным ключом.

Не зная всех деталей, мой лучший совет - объединить таблицы в одну таблицу продуктов. Наличие дополнительных полей, которые заполнены для некоторых продуктов, а не для других, не обязательно является плохим дизайном.

Другой вариант - иметь своего рода модель наследования, где у вас есть таблица с одной продуктом, а затем две таблицы продукта «подтип», которые ссылаются на основную таблицу продуктов и имеют свой собственный специализированный набор полей. Запрос этой модели более болезненна, чем одна таблица IMHO, поэтому я вижу ее как менее желательный вариант.

Ваше объяснение немного расплывчато, но из моего основного понимания я был бы соблазн сделать это

Таблица продуктов содержит общие поля

product
-------
product_id
name
...

Таблица Product_extra1 и таблица product_extra2 содержат разные поля. Эти таблицы имеют одно отношение, применяемое между product.product_id и product_extra1.product_id и т. Д. Применение одного к одному отношению, установив продукт_ид в таблицах иностранных ключей (product_extra1, и т. Д.) Будьте уникальны, используя уникальное ограничение. Вам нужно будет определить бизнес -правила относительно того, как заполняются эти данные

product_extra1
---------------
product_id
extra_field1
extra_field2
....

product_extra2
---------------
product_id
different_extra_field1
different_extra_field2
....

Основываясь на том, что у вас есть выше таблицы Product_category, находится пересекающая таблица (от 1 до многих - от многих до 1), что подразумевает, что каждый продукт может быть связан со многими категориями, теперь это может оставаться прежним.

Это еще один случай Gen-Spec.

Смотрите предыдущее обсуждение

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top