170 похожих чатов

Или может сделать 3ую таблицу где связать между собой authData

и authDataTypes ?

12 ответов

8 просмотров

Есть подозрение, что чего-то не то происходит... внешние ключи нужны для ограничения целостности, грубо говоря, чтобы в authData таблицу не добавили запись с несуществующим ID пользователя и команды. При чем тут джоины вообще? джоинить можно и без внешних ключей. Чтобы быстрее джоинилось можно просто проиндексировать колонки, по которым будет джоин

Ruslan-Postoiuk Автор вопроса
Maks
Есть подозрение, что чего-то не то происходит... ...

Я создал что-то такое, что думаете ? CREATE TABLE `authData` ( `authDataId` int NOT NULL AUTO_INCREMENT, `authDataTypeId` int NOT NULL, `teamId` int NOT NULL, `ownerId` int NOT NULL, `serverName` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, `description` tinytext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci, `deleted` tinyint(1) NOT NULL DEFAULT '0', `creationDate` bigint DEFAULT NULL, `updateDate` bigint DEFAULT NULL, PRIMARY KEY (`authDataId`), KEY `authData_teamId_idx` (`teamId`), KEY `authData_ibfk_ownerId` (`ownerId`), CONSTRAINT `authData_ibfk_ownerId` FOREIGN KEY (`ownerId`) REFERENCES `user` (`userId`) ON DELETE CASCADE, CONSTRAINT `authData_ibfk_teamId` FOREIGN KEY (`teamId`) REFERENCES team (`teamId`) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; CREATE TABLE authDataTypes ( authDataTypeId int NOT NULL AUTO_INCREMENT, authDataId int NOT NULL, type enum('API_KEY', 'BASIC') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, userName varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci, password tinytext, apiKey tinytext, PRIMARY KEY (`authDataTypeId`), KEY authDataType_authDataId_idx (`authDataId`), CONSTRAINT authDataType_ibfk_authDataId FOREIGN KEY (`authDataId`) REFERENCES authData (`authDataId`) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

Ruslan Postoiuk
Я создал что-то такое, что думаете ? CREATE TABLE...

CREATE TABLE `authData` ( `authDataId` int NOT NULL AUTO_INCREMENT, `authDataTypeId` int NOT NULL, CREATE TABLE authDataTypes ( authDataTypeId int NOT NULL AUTO_INCREMENT, authDataId int NOT NULL, почему в обеих таблицах оба айдишника? какая связь между таблицами? 1:1 / 1:N / N:N? По логике, типов должно быть несколько и у каждой записи в authData должен быть тип, но с одним типом будет N записей, так?

Ruslan-Postoiuk Автор вопроса
Ruslan-Postoiuk Автор вопроса
Maks
CREATE TABLE `authData` ( `authDataId` int NOT N...

Вот так будет правильнее создать ? CREATE TABLE `authData` ( `authDataId` int NOT NULL AUTO_INCREMENT, `authDataTypeId` int NOT NULL, `teamId` int NOT NULL, `ownerId` int NOT NULL, `serverName` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, `description` tinytext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci, `deleted` tinyint(1) NOT NULL DEFAULT '0', `creationDate` bigint DEFAULT NULL, `updateDate` bigint DEFAULT NULL, PRIMARY KEY (`authDataId`), KEY `authData_teamId_idx` (`teamId`), KEY `authData_ibfk_ownerId` (`ownerId`), CONSTRAINT `authData_ibfk_ownerId` FOREIGN KEY (`ownerId`) REFERENCES `user` (`userId`) ON DELETE CASCADE, CONSTRAINT `authData_ibfk_teamId` FOREIGN KEY (`teamId`) REFERENCES team (`teamId`) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; CREATE TABLE authDataTypes ( authDataTypeId int NOT NULL AUTO_INCREMENT, type enum('API_KEY', 'BASIC') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, userName varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci, password tinytext, apiKey tinytext, PRIMARY KEY (`authDataTypeId`), KEY authDataType_authDataId_idx (`authDataId`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

Ruslan Postoiuk
Вот так будет правильнее создать ? CREATE TABLE ...

Мне сложно сказать, как будет правильнее, потому что я не знаю всех нюансов, что там за предметная область, что за сущности, как вообще они друг с другом связаны. Почему там вообще 1:1 и почему нельзя это вообще в одну таблицу сложить? Если там отношение 1:0..1, то в какую из них запихнуть foreign key будет зависить от того, в какой таблице может существовать запись, для которой может не быть соответствующей записи во второй таблице. Условно две таблицы Города и Страны. Отношение 1:1. Можно добавить запись в таблицу со странами не добавляя городов. А вот чтобы добавить город, нужно знать в какой он стране. В целом можно и ссылку (foreign key) друг на друга сделать в обеих таблицах, но в таком случае запись в таблицы должна идти в одной транзакции и проверка констрейнтов должна быть отложенной до коммита. Если не ошибаюсь, MySQL не умеет в deferred constraint проверки, так что с ним так не выйдет.

Ruslan-Postoiuk Автор вопроса
Maks
Мне сложно сказать, как будет правильнее, потому ч...

Я сделал так CREATE TABLE `authData` ( `authDataId` int NOT NULL AUTO_INCREMENT, `authDataTypeId` int NOT NULL, `teamId` int NOT NULL, `ownerId` int NOT NULL, `serverName` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, `description` tinytext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci, `deleted` tinyint(1) NOT NULL DEFAULT '0', `creationDate` bigint DEFAULT NULL, `updateDate` bigint DEFAULT NULL, PRIMARY KEY (`authDataId`), KEY `authData_teamId_idx` (`teamId`), KEY `authData_ibfk_ownerId` (`ownerId`), KEY `authData_ibfk_authDataTypeId` (`authDataTypeId`), CONSTRAINT `authData_ibfk_ownerId` FOREIGN KEY (`ownerId`) REFERENCES `user` (`userId`) ON DELETE CASCADE, CONSTRAINT `authData_ibfk_teamId` FOREIGN KEY (`teamId`) REFERENCES team (`teamId`) ON DELETE CASCADE, CONSTRAINT authData_ibfk_authDataTypeId FOREIGN KEY (`authDataTypeId`) REFERENCES authDataType (`authDataTypeId`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; CREATE TABLE authDataType ( authDataTypeId int NOT NULL AUTO_INCREMENT, type enum('API_KEY', 'BASIC') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, userName varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci, password tinytext, apiKey tinytext, PRIMARY KEY (`authDataTypeId`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; То-есть то что вы говорили, в моем случае СТРАНА(authData) имеет форейн кей ГОРОД(authDataType)

Ruslan Postoiuk
Я сделал так CREATE TABLE `authData` ( `authDa...

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

Ruslan-Postoiuk Автор вопроса

Я попробую с другой стороны спросить, смотри Можешь мне помочь пожалуйста со следующей проблемой Мне нужно создать несколько метод авторизаций, например: 1) Basic AUTH когда имя пользователя пароль 2) API Key 3) OAuth 4) JWT Bearer 5) AUTH 2.0 и так далее И мой вопрос как мне хранить данные об авторизации у себя в БД, то есть представь ситуацию: 1) У меня приходит запрос на авторизацию Basic AUTH когда мне приходит username и пассворд Я записываю в колонку username наш юзернейм, а в паспорт захеширован пассворд 2) Ситуация номер 2 мне приходит API Key И я записываю апи кей в колонку api key и типа я не знаю сколько этих метод может быть и мне нужно не хардкодить колонки, а как-то решить эту проблему, может например создать колонку authType где я буду записывать BASIC, AUTH_KEY и тд и может к этому свторить колонку hashPassword куда буду хешировать данные не зависимо от того что мне пришло, но сразу вопрос что делать когда приходит username и пасворд, типа что мне делать с юзернеймом, если у меня только две колонки type и hashPassword, то куда записывать username и такого рода ньюансы от разной типы авторизации Надеюсь ты понял какая у меня проблема)

Ruslan-Postoiuk Автор вопроса
Ruslan Postoiuk
Я попробую с другой стороны спросить, смотри Може...

я поня о чем речь еще из первого описания - погугли про table inheritance. Как вариант - тут есть пример не большой https://ruheni.dev/writing/sql-table-inheritance/ но вообще я не разработчик, возможно есть какие-то варианты получше, но в целом выглядит именно как твой вариант. Есть таблица, в которой указано кто приходит, откуда и с каким типом подключения. А потом на каждый тип есть своя таблица, в которой уже нужные колонки для этого типа подключения. Нужно больше типов? - создал еще таблиц для типов...

Ruslan Postoiuk
Я попробую с другой стороны спросить, смотри Може...

Пока что, учитывая, что для каждого типа авторизацыи надо писать код и миграцыи — правильными выходят варианты или доп.полей в основную таблицу или доп.таблиц дажэ на каждый тип авторизацыи. То, что вы хотите — это или EAV или запихивание информацыи в композитный тип (напр.json или напр. binary-данные, свои для каждого типа). Но не стоит так делать в реляцыонной базе без веских причин.

Похожие вопросы

Обсуждают сегодня

Anyone here suffers from unexplained aural migraines, who would be up for talking for a bit? Doesn't *have* to be aural, but I am not asking about headaches, I mean actual mi...
Martin Rys
55
Привет, нужен совет старших товарищей. Есть глобальная переменная var DefaultDataFolder:string; инициализируем DefaultDataFolder:='a:\_OUT\'; есть примитивная процедур...
Max Otto
11
Вопрос. Теоретический. Есть список команд. Команды отправляю в обработку некой функции, по очереди. Разные команды могут давать разные результаты после обработки. В зависимос...
Serjone
7
Всем вечера. Подскажите как лучше сделать. делаю на Д10 Например будет база данных на SQLite. в ней будет много таблиц. более 50шт Типа справочник. Содержать ID Name Id p...
Андрей Т 🐎
10
Я короче решил скомпилировать Nim в js, я думал он сработает как обычный транслятор. По итогу он мне создал файл с расширением js, и туда поместил кучу кода Вопрос, что это з...
𝕾𝖍𝖆𝖉𝖊 <suspense>
9
это группа токсиков или тех кто помогает?
Ибрагим
9
мы пытаемся подменить функцию, которая имеет меньше инструкций относительно функции, которой подменяем. https://www.reddit.com/r/jailbreakdevelopers/comments/w06ujy/mshookfun...
Óðinn
6
У кого-нибудь есть под рукой функция кодирования юникода, которая из фразы На русском сделает \u041d\u0430\u0020\u0440\u0443\u0441\u0441\u043a\u043e\u043c ?
Daniil Smolyakov
7
подскажите пожалуйста, как мне освободить результат записанный в переменную result? в чем проблема подскажите если МОЖЕТЕ?
Михаил Helper
28
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
Карта сайта