IDにはstring型をつかうこと
[https://protobuf.dev/programming-guides/api/#integer-field-for-id]
オブジェクトの識別子としてint64を使いたくなるが代わりに文字列を使おう。
DB で AUTO_INCREMENT ID などを利用していると特に int64 にしたくなりますが、
とりあえず string 型で定義しておくと、リンク先にあるようなシリアライズする拡張性も生まれてきます。
クライアントが構築/解析することを期待する文字列にデータをエンコードしてはならない
[https://protobuf.dev/programming-guides/api/#dont-encode-data-in-a-string]
利用者にとっては手間がかかり、開発者にも混乱を招く。
string型にメッセージ定義で表現しきれない独自の仕様を内包するために、膨大なコメントを書いたり別個にドキュメントを書いたりしたりコスト増加を招きます。
身近(?)な例でいうと json 文字列そのものを保存したい場合に、string型として定義してはいけないということ。
パースした構造をメッセージ定義して、それぞれをプリミティブな型まで分解したメッセージ定義にしておくこと。
対フロントエンドでHTMLを返す(NG)
[https://protobuf.dev/programming-guides/api/#returning-html]
フロントエンド用の定義でHTMLを返したいケースなど、ついやってしまいがちなパターンの危険性が記載してあります。
通常はデータを返し、HTML構築はフロントエンドのテンプレートを利用するなどしたほうがいいでしょう。