私は Web サイトのユーザー プロファイル システムに取り組んでおり、より良い (スケーラブルな) アプローチを検討しています。私は 2 つの解決策を思いついたので、私が見逃したかもしれない何かへの入力またはポインタを探しています。
次の create table ステートメントは、実行可能にすることを意図したものではなく、関連するテーブルのレイアウトのアイデアを提供するためのものです。
私の最初の考えは次のようなものでした:
CREATE TABLE user(
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
user_email VARCHAR(320),
user_joined DATATIME,
user_last_seen DATATIME,
user_name_first VARCHAR,
user_name_last VARCHAR,
user_name_alias VARCHAR,
user_location_country VARCHAR,
user_location_region VARCHAR,
user_location_city VARCHAR
# ...
);
明らかに、これはまったくスケーラブルではなく、追加のプロパティを追加するのは面倒です。1 つの利点は、特定のプロパティ セットに一致するユーザーをすばやく検索できることです。私は少し調べてみましたが、これはかなり一般的なアプローチです (Wordpress など)。
私の2番目のアプローチ(私が現在遊んでいるアプローチ)ははるかにスケーラブルですが、パフォーマンスが少し心配です:
CREATE TABLE user(
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
user_email VARCHAR(320)
);
CREATE TABLE user_profile(
user_id INT UNSIGNED NOT NULL,
visibility ENUM('PRIVATE', 'PUBLIC'),
name VARCHAR,
value VARCHAR
);
このアプローチを使用すると、すべての使用に一連のキーと値のペアが関連付けられているため、追加のプロパティを簡単に追加したり、ログイン時にユーザー プロファイルをロードしたりできます。ただし、最初のアプローチで持っていたすべての型情報が失われるため (たとえば、DATETIME は書式設定された文字列として格納されるようになりました)、一部の検索が煩わしくなります。これにより、ユーザーが公開したいプロパティをより細かく制御できます。
両方の方法の長所と短所のバランスを取るには、ハイブリッド アプローチの方がよいでしょうか? SO はどのような方法を使用しますか? 私が考えていない、または見逃していない、これに対する別のアプローチはありますか?
拡張:ハイブリッド アプローチでは、user テーブルのプロパティを user_profile テーブルに挿入して、他のユーザーへの可視性を制御することも有利でしょうか?それとも追加のオーバーヘッドと見なされる可能性がありますか?