Наследование в 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
, так далее).