1

レコードのリストがありprofileます。各レコードは次のようになっています。

{
  "name": "Peter Pan",
  "contacts": [
    {
      "key": "mobile",
      "value": "1234-5678"
    }
  ],
  "addresses": [
    {
      "key": "postal",
      "value": "2356 W. Manchester Ave.\nSomewhere District\nA Country"
    },
    {
      "key": "po",
      "value": "PO Box 1234"
    }
  ],
  "emails": [
    {
      "key": "work",
      "value": "abc@work.com"
    },
    {
      "key": "personal",
      "value": "abc@personal.com"
    }
  ],
  "url": "http://www.example.com/"
}

私は次のスキーマ構造を持つことを考えます:

  1. およびフィールドを持つprofileテーブル。idname
  2. 、、、フィールドを持つprofile_contactテーブル。idprofile_idkeyvalue
  3. 、、、フィールドを持つprofile_addressテーブル。idprofile_idkeyvalue
  4. 、、、フィールドを持つprofile_emailテーブル。idprofile_idkeyvalue

ただし、このような単純なJSONには、作成するテーブルが多すぎると思います。

  1. 1つのレコードだけを取得するために多くのJOINSが実行されるため、テーブル全体を検索するときにパフォーマンスの問題が発生しますか?
  2. 上記のJSONレコードをデータベースにモデル化するためのより良い方法は何でしょうか?SQLでは、またはNoSQLではより良いですか?
4

2 に答える 2

0

それはちょっと依存します。ユーザーごとに「無限の」数の連絡先/アドレス/電子メールを計画している場合、あなたのアイデアはかなり良い方法です。

また、次のことを検討することもできます。

以下を含むPROFILEテーブル:

  • PROFILE_ID
  • NAME
  • EMAIL_ADDRESS_WORK
  • EMAIL_ADDRESS_PERSONAL
  • PHONE_NUMBER
  • MOBILE_NUMBER

以下を含むADDRESSテーブル:

  • ADDRESS_ID
  • PROFILE_ID
  • STREET
  • CITY
  • ..等

つまり、ユーザーごとに2種類のメールと2種類の電話番号を設定でき、それらはプロファイル自体とともに保存されます。

または、電話番号と電子メールアドレス(および場合によっては他のタイプ)の両方を含む別のCONTACTテーブルを選択することもできます。

  • CONTACT_TYPE(電話、モバイル、email_work、email_personal)
  • CONTACT_VALUE
  • PROFILE_ID

3つすべて(私のものとあなたのもの)は完全に機能する可能性があります。何があなたのために働くかをよりよく決定するために、あなたはそこにあるすべての可能性を書き留めるべきです(そしてそうなる可能性があります)。プロファイルごとに10個の電子メールアドレスを追加できるようにしたい場合(プロファイルと一緒に保存するのはばかげているでしょう)、IM、Facebook、ICQ、Twitterなどのさまざまな連絡先タイプに非常に大きなバリエーションがある場合があります(その後、 CONTACTSテーブルはうまくフィットします)。

したがって、どのタイプのデータを取得するかを見つけてリストし、それが特定のモデルにどのように適合するかを確認してから、最も適切なデータを選択してください:)

于 2013-01-07T09:28:59.180 に答える
-1

これは、データベース設計の最も一般的なケースです...jsonを含めたからといって、新しいものとしてスレッド化するのをやめるべきです:-)

作成するだけ

ユーザー: ID、名前

連絡先: ユーザー ID、ID、キー、値

メールアドレスと住所、その他連絡先のようなもの。

ここで、ユーザーから選択し、user.id=id で他のテーブルを内部結合するだけです。

于 2013-06-10T03:04:56.113 に答える