Nano Hash - криптовалюты, майнинг, программирование

Уникальные имена пользователей в 2-х таблицах на разных уровнях. Подходящий дизайн базы данных?

У меня есть таблица с поставщиками. Эта таблица содержит, среди прочего, хеш имени, имени пользователя и пароля.

Иногда поставщиком является всего один человек, и в этом случае это работает нормально. Но иногда поставщиком является компания, и в этом случае нескольким сотрудникам может потребоваться войти в систему. До сих пор все сотрудники поставщика использовали одно имя пользователя/пароль для каждого поставщика. Теперь я хочу дать каждому индивидуальное удостоверение личности.

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

Я мог бы, конечно, обеспечить уникальные имена пользователей в PHP, но мне интересно, не делаю ли я ошибку проектирования базы данных. Я подумал о создании новой таблицы «пользователи», чтобы ввести все учетные данные, но почему-то это кажется неправильным. Какие-нибудь советы?


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

Ответы:


1

Я думаю, что и Дэвид Олдридж, и Рэй Мор дали вам потенциально подходящие предложения по дизайну, но я хотел бы ответить на ваш вопрос немного более целостно и сосредоточив внимание на вашем утверждении, что «[вы] задаетесь вопросом, [вы] сделать ошибку проектирования базы данных».


Краткая версия: Да, я думаю, что вы допустили ошибку проектирования — настаиваете на том, чтобы указать данные для входа в систему от одного поставщика в таблице поставщиков — и это приводит к тому, что вы отклоняете оба ваши собственные альтернативные идеи, а также идеи, предложенные другими.

Подробная версия. Во-первых, подумайте об этом концептуально, а не технически. Кому принадлежат данные для входа? Раньше они принадлежали поставщику. Теперь они принадлежат сотруднику поставщика.

Ранее в процессе моделирования данных (то есть до того, как вы дойдете до момента создания физической модели) мы говорим об атрибутах, а не о столбцах, и объектах, а не о таблицах, поэтому данные для входа в систему являются атрибутами сущности сотрудника поставщика, а не атрибутами субъект поставщика. Это означает, что когда вы доберетесь до своей физической базы данных, эти столбцы должны быть в таблице SupplierContact (или связаны с ней).

Так почему же логины всегда принадлежат сотруднику поставщика, а не поставщику? Подумайте об этом сценарии:

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

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


Альтернативная ситуация. Если у вас есть законная причина иметь два разных типа учетных записей — организационную учетную запись для поставщиков и индивидуальную учетную запись для сотрудников поставщика, — то это другая ситуация. Тем не менее, вы все равно можете достичь обеих целей: иметь все учетные записи в одной таблице, при этом связывая каждый тип учетной записи с соответствующей таблицей (например, Поставщик или ПоставщикКонтакт).

Например, у вас может быть таблица под названием «Учетная запись», в которой хранятся данные для входа. Оттуда есть несколько вариантов, чтобы связать эту таблицу с поставщиком или SupplierContact. Я не хочу вдаваться в вопрос, какой вариант выбрать, так как это вопрос, который хорошо обсуждается в другом месте (в том числе на SO), и, возможно, это вопрос вкуса, но вот некоторые варианты:

  • Включите в учетную запись два столбца внешнего ключа, допускающие значение NULL, один из которых может содержать SupplierId, а другой может содержать SupplierContactId. Потенциально создайте ограничение, чтобы гарантировать, что одно из двух всегда заполнено.
  • Создайте две отдельные таблицы, SupplierAccount и SupplierContactAccount, с двумя столбцами в каждой. Первый должен иметь столбцы SupplierId и AccountId с внешними ключами для Supplier и Account, а второй должен иметь столбцы SupplierContactId и AccountId с внешними ключами для SupplierContact и Account. Потенциально создайте ограничения, чтобы строки в Account не были связаны более чем с одним Supplier или SupplierContact.

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


Еще один вариант: тем временем у меня возникла другая мысль по этому поводу. Я не буду вдаваться в подробности, так как вы уже приняли это и, по-видимому, знаете достаточно, чтобы двигаться дальше, но другим вариантом может быть использование шаблона моделирования данных Party.

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

Вот статья об этой идее, которую я нашел полезной, когда впервые столкнулся с ней . Лен Сильверстон, написавший эту статью, также опубликовал несколько очень полезных книг по моделированию данных, если вы хотите получить больше информации. Книги работают от более концептуального/абстрактного уровня вплоть до физических схем баз данных. Если вы поищите в Интернете шаблон модели данных партии, я уверен, что вы сможете найти аналогичные ресурсы в Интернете, если это окажется полезным для вашей ситуации.

04.06.2015

2

Это хороший случай для создания второй таблицы.

Рассмотрим следующие структуры таблиц:

Suppliers: SupplierId, Name, Address, etc..
SupplierLogins: SupplierLoginId, SupplierId, Username, Password

Вы можете использовать эту структуру для добавления одного логина или нескольких логинов. Ваша уникальная комбинация может быть на комбинации SupplierId, Username. ИМО, идентификаторы электронной почты - отличный логин - он устраняет необходимость запоминать имя пользователя.

Также, например, если [email protected] меняет работу и переходит к другому поставщику, то он становится [email protected], так что вам не придется терять данные всех вещей под старым логином.

03.06.2015
  • Спасибо, но в вашем ответе мне не хватает связи между логинами и таблицей контактов. 04.06.2015

  • 3

    Я бы поместил все логины в таблицу контактов, даже для поставщиков с одним логином. Вам по-прежнему нужна контактная информация для одного логина поставщика, поместите всю подобную информацию в одну таблицу.

    03.06.2015
  • Я думал об этом, но в идеале я хотел бы сохранить возможность иметь хэши имен пользователей и паролей в таблице поставщиков для поставщиков из одного человека. Я согласен, что ваше предложение более аккуратно, хотя. 04.06.2015
  • Ну, вы не можете иметь удобство одного и того же типа данных в двух таблицах без неудобств, связанных с трудностями обеспечения уникальности. Иметь все логины в одной таблице намного чище. 04.06.2015

  • 4

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

    1. учетная запись (идентификатор, имя, адрес, логин, пароль и т. д.)
    2. поставщик (идентификатор, учетная запись, ...)
    3. клиент
    4. и Т. Д.

    Теперь вы создаете связь между поставщиком и учетной записью и клиентом и учетной записью. Чтобы позволить компании иметь несколько логинов, я создаю дочерние учетные записи для учетной записи компании. Для этого у вас может быть поле с именем parent и создать связь с другой учетной записью и, возможно, поле с именем type, где вы хотите определить, является ли это учетной записью пользователя или учетной записью компании.

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

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

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

    04.06.2015
  • Спасибо за ваше предложение. Мне нравится иметь столбец, определяющий уровень привилегий, но мне не нравится, когда родители и дети находятся в одной таблице, не так ли, как вы предлагаете? 04.06.2015
  • Новые материалы

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

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

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

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..