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

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

и authDataTypes ?

12 ответов

20 просмотров

Есть подозрение, что чего-то не то происходит... внешние ключи нужны для ограничения целостности, грубо говоря, чтобы в 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 Автор вопроса
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-данные, свои для каждого типа). Но не стоит так делать в реляцыонной базе без веских причин.

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

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

#include <stdio.h> #include <stdlib.h> #include <time.h> void mass_first_generate(int mass[5][7]) {     for (int N = 0; N < 5; N++) {         for (int A = 0; A < 7; A++) {   ...
Чувак
6
https://www.linkedin.com/posts/ugama-benedicta-kelechi-codergirl-103041300_mobiledevelopment-fluttertraining-handsonlearning-activity-7263445699227254784-IdHB?utm_source=share...
CoderGirl
16
Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
Ну вот просто даже давайте вот как. Какой нибудь конкретный кейс, можете в пример привести, где бч работает и приносит прикладную пользу, а не просто что бы было? Не крипту.
Alexander Andreev
22
объясните пожалуйста, почему функция не работает должным образом? вроде должно брать активное окно сравнивать его размер с размером экрана, и если есть совпадение = true прове...
JF
12
Гляньте, че бывает: Сегодня по одному проекту одной вебстудии делал проект небольшой, на их хостинге. На Modx revo. В определенный момент , работая в админке, вдруг перестал р...
Artem
7
лучше скажите, причём тут паскаль?
Alexey Kulakov
36
Но, может, есть уже проверенная? Наши требования такие: 1. Сообщения должны приходить из Инста в CRM оду 2. Должна быть возможность подключить несколько экаунтов Инстаграм. Р...
Alexander Sharoiko MSE / Александр Шаройко
12
> Копаем глубже > Следующий момент был, когда я спросил его, знает ли он JavaScript. Он ответил, что его учили работать с C#. Я тоже в университете писал на C#, но даже там мн...
Oleg Volkov
4
И никого не интересует какие пакеты кто использует. ((% Заходишь на сайт симфони и видишь поддержку Украины - по законам РФ это ж экстремизм. Только никто не отказывается от с...
Am Ambrion
11
Карта сайта