O padrão é usar o campo key na tabela plugin_store_rows para armazenar tanto um namespace quanto um identificador único, ou seja:
<namespace>_<id>
Esse padrão é menos comum nos plugins principais do Discourse atualmente, com um declínio geral no uso do PluginStore, por exemplo:
-
O plugin OAuth2 Basic o usava para armazenar dados de contas associadas até que migrássemos para user_associated_accounts.
-
O plugin Poll o usava antes da migração para sua própria tabela.
No entanto, ele ainda é utilizado em alguns lugares, incluindo o próprio código-base principal do Discourse, por exemplo, no modelo Reviewables.
Eu também uso esse padrão em vários plugins.
A principal razão para o uso desse padrão é que a tabela plugin_store_rows é utilizada por múltiplos plugins (e alguns serviços principais), portanto, as colunas de identificação, ou seja, id e plugin_name, não podem ser usadas para identificação interna dentro de cada sistema que utiliza o PluginStore. Assim, um sistema baseado em strings é usado na coluna key.
Em relação à alteração da estrutura do banco de dados a partir de um plugin, @gdpelican tem um bom post sobre isso:
Pessoalmente, ainda estou bastante cauteloso em fazer isso, pois ao trabalhar em um plugin de terceiros, você não tem controle sobre o namespace, se seu plugin será removido e quais alterações potencialmente conflitantes podem ser feitas no Discourse principal.
Como @gdpelican menciona, você precisa fornecer uma maneira para o usuário do plugin remover as alterações no banco de dados se ele desinstalar o plugin.
Forneça um método para os usuários limparem as alterações no seu banco de dados caso não queiram mais o seu plugin. Eu fiz isso com uma tarefa rake.
Acho que isso é muito técnico para a maioria dos usuários de plugins e representa um risco se eles não estiverem cientes desse detalhe.
Além disso, ainda não encontrei uma necessidade real de sair dos limites do PluginStore e CustomFields.
Dito tudo isso, pessoalmente, eu estaria a favor de um novo método nesse sentido no PluginStore, pois acho o padrão útil.
@david, estaria interessado em ouvir sua opinião sobre o acima também.