Наследование в Go с использованием или простой обработкой нескольких типов пользователей

Я хочу научиться ходить ради удовольствия и иметь представление о веб-приложении, и я планирую использовать фреймворк Fibre и, вероятно, использовать Mysql или postgres в качестве базы данных. У меня двоякие вопросы.

Что лучше всего подходит для нескольких типов пользователей. Я знаю, что го на самом деле не является языком ООП (первый язык, который я изучаю, но не ООП). С трудом пытаюсь понять, как это сделать. Поскольку у меня будет 2 пользователя, 1 тренинг, другой клиент. У них будут общие поля, например: имя, адрес электронной почты, пароль и т. Д., А некоторые будут уникальными для других. У них также будут отношения "один ко многим" (у тренера может быть много клиентов). Я понимаю, что организации могут справиться с отношениями. Но как бы я структурировал код. Было бы у меня 2 структуры моделей со всеми полями или интерфейс, от которого оба происходят.

Думаю, вторая часть - это скорее вопрос о БД. Когда я обычно создаю приложения с несколькими типами пользователей, это обычно контролируется полем isAdmin в пользовательской таблице, но поскольку типы пользователей будут нуждаться в другой информации, но немного похожей, что является лучшей практикой для этого дизайна db. Я думал о 3-х столах для пользователей, тренеров и клиентов. где таблицы клиента и тренера имеют fk к таблице пользователя. Это вообще хорошая идея?

1 ответ

Решение

Если у вас есть общие поля среди трех типов пользователей, вы можете использовать встраивание, чтобы сделать что-то вроде:

type commonUser struct {
    // common fields all go here
    Name string
}

type User struct {
    Foo string // field unique to User
    commonUser
}

type Trainer struct {
    Training bool // field unique to Trainer
    commonUser
}

type Client struct {
    ClientID string // field unique to Client
    commonUser
}

Каждый тип (User, Trainer, Client) и т. д. могут определять свой собственный метод приемника (т.е. func (c *Client) Save() {...}) для хранения записи в базе данных. Это вполне может быть одна таблица (и использовать что-то вродеisAdmin или isTrainerразличать между ними; или вы можете разделить его на несколько отдельных таблиц (trainers, clients, так далее).

Другие вопросы по тегам