Bu soru, bir veritabanını nasıl tasarlamalıyım, daha iyi bir çözümün ne olacağına bağlı olarak ilişkisel / nosql veritabanları olabilir.
"Şirket" ve "Kullanıcı" yı izlemek için bir veritabanı içeren bir sistem oluşturmanız gerektiğinde bir gereklilik verilmiştir. Tek bir kullanıcı her zaman yalnızca bir şirkete aittir
- Bir kullanıcı yalnızca bir şirkete ait olabilir
- Bir şirketin birçok kullanıcısı olabilir
"Şirket" tablosunun tasarımı oldukça basittir. Şirket aşağıdaki özelliklere / sütunlara sahip olacaktır: (basit tutalım)
ID, COMPANY_NAME, CREATED_ON
İlk senaryo
Basit ve basit, kullanıcıların hepsi aynı özniteliğe sahiptir, bu nedenle ilişkisel tarzda, kullanıcı tablosunda kolayca yapılabilir:
ID, COMPANY_ID, FIRST_NAME, LAST_NAME, EMAIL, CREATED_ON
İkinci senaryo
Farklı şirketler kullanıcıları için farklı profil özniteliği depolamak isterse ne olur? Her şirket, o şirketin tüm kullanıcıları için geçerli olacak tanımlanmış bir öznitelik kümesine sahip olacaktır.
Örneğin:
- A şirketi depolamak istiyor: LIKE_MOVIE (boolean), LIKE_MUSIC (boolean)
- B Şirketi saklamak istiyor: FAV_CUISINE (String)
- C Şirketi depolamak istiyor: OWN_DOG (boolean), DOG_COUNT (int)
Yaklaşım 1
kaba kuvvet yolu, kullanıcı için tek bir şemaya sahip olmak ve şirkete ait olmadıklarında boş değerlere sahip olmaktır:
ID, COMPANY_ID, FIRST_NAME, LAST_NAME, EMAIL, LIKE_MOVIE, LIKE_MUSIC, FAV_CUISINE, OWN_DOG, DOG_COUNT, CREATED_ON
Bu çok kötü çünkü bir sürü NULLS ve kendileriyle alakasız sütunlara sahip kullanıcı satırları elde edeceksiniz (yani A Şirketine ait tüm kullanıcıların FAV_CUISINE, OWN_DOG, DOG_COUNT) için NULL değerleri var
Yaklaşım 2
ikinci bir yaklaşım, "serbest form alanı" na sahip olmaktır:
ID, COMPANY_ID, FIRST_NAME, LAST_NAME, EMAIL, CUSTOM_1, CUSTOM_2, CUSTOM_3, CREATED_ON
Özel alanların ne olduğu hakkında hiçbir fikriniz olmadığı için kendi başına kötü olurdu, veri türü depolanan değerleri yansıtmayacaktır (örn. İnt değerini VARCHAR olarak depolayacağız).
Yaklaşım 3
PostgreSQL JSON alanına baktım, bu durumda:
ID, COMPANY_ID, FIRST_NAME, LAST_NAME, EMAIL, CUSTOM_PROFILE_JSON, CREATED_ON
Bu durumda, bir kullanıcıya farklı şemalar nasıl uygulayabilirsiniz? A Şirketine sahip bir kullanıcının şemasına benzemesi gerekir
{"LIKE_MOVIE":"boolean", "LIKE_MUSIC": "boolean"}
C Şirketine sahip bir kullanıcının farklı bir şeması olurken:
{"OWN_DOG ":"boolean", "DOG_COUNT": "int"}
Bu sorunu nasıl çözmeliyim? Tek bir "nesne" (Kullanıcı) için sahip oldukları ilişkiye (Şirket) dayalı olarak bu esnek şemaya izin vermek için veritabanını nasıl düzgün bir şekilde tasarlayabilirim?
ilişkisel çözüm? nosql çözümü?
Düzenleme: Ayrıca kullanıcı özniteliklerini sütunlar yerine satırlarda depolayacak bir "CUSTOM_PROFILE" tablosu düşündüm.
Bu yaklaşımla ilgili 2 sorun vardır:
1) Kullanıcı başına veriler sütunlar yerine satırlar olarak büyür - ve bu, kullanıcının tam bir resmini elde etmek için çok fazla birleştirme yapılması, farklı özel özelliklerde "özel profil" tablosuna birden çok ekleme yapılması anlamına gelir
2) Verilerin tamsayı veya boole vb. Olması gerektiğini bilsek bile, veri değeri genel olarak VARCHAR olarak saklanır.