Làm thế nào bạn sẽ thiết kế một cơ sở dữ liệu người dùng với các trường tùy chỉnh


18

Câu hỏi này xoay quanh việc tôi nên thiết kế cơ sở dữ liệu như thế nào, nó có thể là cơ sở dữ liệu quan hệ / nosql, tùy thuộc vào điều gì sẽ là giải pháp tốt hơn


Đưa ra một yêu cầu trong đó bạn sẽ cần tạo một hệ thống sẽ liên quan đến cơ sở dữ liệu để theo dõi "Công ty" và "Người dùng". Một người dùng luôn chỉ thuộc về một công ty

  • Một người dùng chỉ có thể thuộc về một công ty
  • Một công ty có thể có nhiều người dùng

Thiết kế cho bảng "Công ty" khá đơn giản. Công ty sẽ có các thuộc tính / cột sau: (hãy giữ cho nó đơn giản)

ID, COMPANY_NAME, CREATED_ON

Kịch bản đầu tiên

Đơn giản và dễ hiểu, tất cả người dùng đều có cùng thuộc tính, vì vậy điều này có thể dễ dàng thực hiện theo kiểu quan hệ, bảng người dùng:

ID, COMPANY_ID, FIRST_NAME, LAST_NAME, EMAIL, CREATED_ON

Kịch bản thứ hai

Điều gì xảy ra nếu các công ty khác nhau muốn lưu trữ thuộc tính hồ sơ khác nhau cho người dùng của họ. Mỗi công ty sẽ có một bộ thuộc tính được xác định sẽ áp dụng cho tất cả người dùng của công ty đó.

Ví dụ:

  • Công ty A muốn lưu trữ: THÍCH_MOVIE (boolean), THÍCH_MUSIC (boolean)
  • Công ty B muốn lưu trữ: FAV_CUISINE (Chuỗi)
  • Công ty C muốn lưu trữ: OWN_DOG (boolean), DOG_COUNT (int)

Cách tiếp cận 1

cách thức mạnh mẽ là có một lược đồ duy nhất cho người dùng và để họ có null khi họ không thuộc về công ty:

ID, COMPANY_ID, FIRST_NAME, LAST_NAME, EMAIL, LIKE_MOVIE, LIKE_MUSIC, FAV_CUISINE, OWN_DOG, DOG_COUNT, CREATED_ON

Điều này thật khó chịu vì bạn sẽ có rất nhiều NULLS và hàng người dùng có các cột không liên quan đến họ (ví dụ: tất cả người dùng thuộc Công ty A có các giá trị NULL cho FAV_CUISINE, OWN_DOG, DOG_COUNT)

Cách tiếp cận 2

cách tiếp cận thứ hai, là có "trường biểu mẫu miễn phí":

ID, COMPANY_ID, FIRST_NAME, LAST_NAME, EMAIL, CUSTOM_1, CUSTOM_2, CUSTOM_3, CREATED_ON

Điều này sẽ gây khó chịu cho chính bạn vì bạn không biết trường tùy chỉnh là gì, kiểu dữ liệu sẽ không phản ánh các giá trị được lưu trữ (ví dụ: chúng tôi sẽ lưu trữ giá trị int dưới dạng VARCHAR).

Cách tiếp cận 3

Tôi đã xem xét trường JSON của PostgreSQL, trong trường hợp đó bạn sẽ có:

ID, COMPANY_ID, FIRST_NAME, LAST_NAME, EMAIL, CUSTOM_PROFILE_JSON, CREATED_ON

Trong trường hợp này, làm thế nào bạn có thể áp dụng các lược đồ khác nhau cho người dùng? Người dùng với Công ty A sẽ có lược đồ giống như

 {"LIKE_MOVIE":"boolean", "LIKE_MUSIC": "boolean"}

Trong khi người dùng với Công ty C sẽ có một lược đồ khác:

 {"OWN_DOG ":"boolean", "DOG_COUNT": "int"}

Tôi nên giải quyết vấn đề này như thế nào? Làm cách nào tôi có thể thiết kế cơ sở dữ liệu đúng cách để cho phép lược đồ linh hoạt này cho một "đối tượng" (Người dùng) duy nhất dựa trên mối quan hệ họ có (Công ty)?

Giải pháp quan hệ? Giải pháp nosql?


Chỉnh sửa: Tôi cũng đã nghĩ về bảng "CUSTOM_PROFILE" về cơ bản sẽ lưu trữ các thuộc tính người dùng theo hàng thay vì cột.

Có 2 vấn đề với cách tiếp cận này:

1) Dữ liệu tăng theo mỗi người dùng tăng theo hàng thay vì cột - và điều này có nghĩa là để có được một bức tranh đầy đủ về người dùng, rất nhiều phép nối cần được thực hiện, nhiều lần tham gia vào bảng "hồ sơ tùy chỉnh" trên các thuộc tính tùy chỉnh khác nhau

2) Giá trị dữ liệu luôn được lưu trữ dưới dạng VARCHAR là chung, ngay cả khi chúng ta biết dữ liệu được coi là số nguyên hoặc boolean, v.v.


3
Nếu các công ty khác nhau có các bộ dữ liệu đa giá trị khác nhau trên mỗi khách hàng, thì bạn hoàn toàn cần một bảng liên kết COMPANY_CUSTOMER. Mọi thứ khác sẽ khiến bạn đau đớn rất sớm.
Kilian Foth 11/03/2015

Làm thế nào một bảng liên kết sẽ giúp với dữ liệu tùy chỉnh? các cột sẽ vẫn phải khác nhau
noobcser 11/03/2015

1
Bạn phải trình bày thực tế "Mật khẩu của Kilian cho IKEA là 'mèo con'" với một bộ dữ liệu như "CÔNG TY: IKEA, KHÁCH HÀNG: Kilian, ATTRIBUTE: mật khẩu, GIÁ TRỊ: mèo con". Bất cứ điều gì đơn giản hơn sẽ không làm công việc.
Kilian Foth 11/03/2015

3
Một lược đồ là một điều cố định, theo định nghĩa; bạn không thể thiết lập một nếu bạn không biết những lĩnh vực mà bạn cần là gì. Hãy xem Entity-Attribution-Value cho các vấn đề một chiều như thế này có xu hướng được giải quyết trong cơ sở dữ liệu quan hệ.
Mason Wheeler

Câu trả lời:


13

Hãy coi đây là một sự thay thế. Hai ví dụ trước sẽ yêu cầu bạn thay đổi lược đồ khi phạm vi của ứng dụng tăng lên, ngoài ra giải pháp "custom_column" rất khó để mở rộng và duy trì. Cuối cùng, bạn sẽ kết thúc với Custom_510 và sau đó chỉ cần tưởng tượng bảng này sẽ hoạt động khủng khiếp như thế nào.

Trước tiên hãy sử dụng lược đồ công ty của bạn.

[Companies] ComnpanyId, COMPANY_NAME, CREATED_ON

Tiếp theo, chúng tôi cũng sẽ sử dụng lược đồ Người dùng của bạn cho các thuộc tính bắt buộc cấp cao nhất sẽ được sử dụng / chia sẻ bởi tất cả các công ty.

[Users] UserId, COMPANY_ID, FIRST_NAME, LAST_NAME, EMAIL, CREATED_ON

Tiếp theo, chúng tôi xây dựng một bảng trong đó chúng tôi sẽ xác định các thuộc tính động của chúng tôi dành riêng cho từng thuộc tính người dùng tùy chỉnh của công ty. Vì vậy, ở đây một giá trị mẫu của cột Thuộc tính sẽ là "LikeMusic":

[UserAttributeDefinition] UserAttributeDefinitionId, CompanyId, Attribute

Tiếp theo, chúng tôi xác định bảng UserAttribution sẽ giữ các giá trị thuộc tính người dùng

[UserAttributes] UserAttributeDefinitionId, UserId, Value

Điều này có thể được sửa đổi theo nhiều cách để tốt hơn cho hiệu suất. Bạn có thể sử dụng nhiều bảng cho UserAttribution làm cho mỗi bảng cụ thể cho loại dữ liệu được lưu trữ trong Giá trị hoặc chỉ để nó dưới dạng VarChar và làm việc với nó như một kho lưu trữ khóa.

Bạn cũng có thể muốn chuyển CompanyId khỏi bảng UserAttributionDefiniton và vào một bảng tham chiếu chéo để chứng minh trong tương lai.


cảm ơn - Tôi mặc dù về cách tiếp cận như vậy - xin vui lòng xem chỉnh sửa. 2 vấn đề: 1) Dữ liệu phát triển thành hàng, có nghĩa là để có được một bức tranh đầy đủ về người dùng, bạn sẽ phải thực hiện nhiều lần tham gia. 2) "giá trị" sẽ luôn được lưu trữ dưới dạng VARCHAR để chung chung, ngay cả khi giá trị thực sự là int hoặc boolean, v.v.
noobcser 11/03/2015

1
Nếu bạn sử dụng int / bigint cho danh tính bảng và tham gia vào những người bạn sẽ không gặp bất kỳ vấn đề nào về hiệu suất cho đến khi bạn ở số lượng hàng cực lớn. Bây giờ nếu bạn bắt đầu tìm kiếm dựa trên các giá trị thuộc tính thì điều này có thể gây ra vấn đề nếu bạn bắt đầu nhận được một số lượng lớn các bản ghi. Trong trường hợp này, tôi sẽ làm việc với một DBA để xác định xem có chỉ mục nào có thể được tạo hoặc có thể là chế độ xem được lập chỉ mục có thể tăng tốc các loại tìm kiếm này không. Tôi đã sử dụng một lược đồ tương tự và phải mất 100 triệu bản ghi mỗi năm mà không gặp vấn đề gì về hiệu năng nên thiết kế cơ sở hoạt động khá tốt IMO
P. Roe

Nếu báo cáo, lọc, truy vấn là cần thiết và các thuộc tính khác nhau có thể thuộc về các tập dữ liệu khác nhau. Cách tiếp cận này sẽ tốt hơn NoQuery? Tôi đang cố gắng để hiểu sự khác biệt hiệu suất. Tình huống tương tự chỉ người dùng mới có thể xác định báo cáo có chứa các trường do người dùng xác định.
kos

Trong cách tiếp cận trên, làm thế nào để chúng ta thực hiện điều tìm kiếm, như diff. các công ty muốn tìm kiếm trên các lĩnh vực của họ, bao gồm cả các lĩnh vực của người dùng. Cách tiếp cận chính xác để cung cấp khả năng tìm kiếm có thể mở rộng trên đầu trang này
techagrammer

Bạn có thể tìm kiếm nó bình thường với rất nhiều tham gia. Bạn có thể sử dụng tập lệnh ETL để trích xuất dữ liệu bạn muốn tìm kiếm và đặt nó trong một cấu trúc không chuẩn hóa hơn. Cuối cùng, bạn có thể cố gắng sử dụng các chế độ xem được lập chỉ mục như một phương pháp để tìm kiếm. Cá nhân tôi khuyên dùng phương pháp ETL để tạo các cấu trúc không chuẩn hóa dễ tìm kiếm.
P. Roe

7

Sử dụng cơ sở dữ liệu NoQuery. Sẽ có tài liệu của công ty và người dùng. Người dùng sẽ có một phần của lược đồ của họ được tạo động dựa trên mẫu người dùng (văn bản để chỉ ra các trường / loại cho công ty đó.

\Company\<uniqueidentifier>
    - Name: <Name>
    - CreatedOn: <datetime>
    - UserTemplate: <Text>

\User\<uniqueidentifier>
    - COMPANY_ID: <ID>
    - FIRST_NAME: <Text>
    - LAST_NAME: <Text>
    - EMAIL: <Text>
    - CREATED_ON: <datetime>
    - * Dynamically created fields per company

Đây là cách nó có thể trông giống như trong Firebase.com Bạn sẽ phải học cách làm điều đó trong bất cứ điều gì bạn chọn.


đây là những gì tôi đang nghĩ về hoặc có thể các cột JSON. Làm thế nào là hiệu suất về truy vấn, lọc báo cáo so với giải pháp được đề xuất bởi PRoe.
kos

1
Bất cứ khi nào bạn nén dữ liệu vào json hoặc xml và sau đó ném nó vào một cột, nó sẽ rất chậm để tìm kiếm. Nếu bạn cần tìm kiếm dữ liệu được trình bày trong câu trả lời của tôi ở trên thì tôi sẽ khuyên bạn nên sử dụng các chế độ xem được lập chỉ mục để truy xuất dữ liệu. Nếu giải pháp đó không lý tưởng thì tôi khuyên bạn nên sử dụng ETL để sao chép dữ liệu vào cấu trúc có thể dễ dàng tìm kiếm và báo cáo.
P. Roe

Trong cách tiếp cận trên, làm thế nào để chúng ta thực hiện điều tìm kiếm, như diff. các công ty muốn tìm kiếm trên các lĩnh vực của họ, bao gồm cả các lĩnh vực của người dùng. Cách tiếp cận chính xác để cung cấp khả năng tìm kiếm có thể mở rộng trên đầu trang này
techagrammer

Trong cơ sở dữ liệu nosql, bạn có thể có dữ liệu dư thừa, nhưng nó được cấu trúc theo cách có thể tìm kiếm được. Một trong những hiển thị ở trên là bởi định danh duy nhất. Một số khác có thể là \ Company \ Name. Nó tương tự như có nhiều chỉ mục.
JeffO

3

Nếu bạn thường xuyên chạy vào các yêu cầu trường tùy chỉnh, tôi thực sự sẽ mô hình hóa nó khá giống với cơ sở dữ liệu. Tạo một bảng chứa siêu dữ liệu về từng trường tùy chỉnh, CompanyCustomField (thuộc về loại dữ liệu, v.v.) và một bảng khác CompanyCustomFieldValues ​​có chứa CustomerId, FieldId và giá trị. Nếu bạn đang sử dụng một cái gì đó như Microsoft Sql Server, tôi sẽ có cột giá trị là kiểu dữ liệu sql_variant.

Tất nhiên điều này không dễ dàng vì bạn sẽ cần một giao diện cho phép quản trị viên xác định các trường tùy chỉnh cho từng khách hàng và một giao diện khác thực sự sử dụng siêu dữ liệu này để xây dựng giao diện người dùng để thu thập các giá trị trường. Và nếu bạn có các yêu cầu khác, chẳng hạn như nhóm các trường lại với nhau hoặc cần thực hiện một loại danh sách chọn, bạn sẽ cần phải bổ sung thêm với siêu dữ liệu / các bảng khác (ví dụ: CompanyCustomFieldPickListOptions).

Điều này không tầm thường, nhưng nó có ưu điểm là không yêu cầu thay đổi cơ sở dữ liệu / thay đổi mã cho mỗi trường tùy chỉnh mới. Bất kỳ tính năng nào khác của trường tùy chỉnh cũng sẽ cần được mã hóa (ví dụ: nếu bạn muốn xác thực lại giá trị chuỗi hoặc chỉ cho phép ngày giữa các phạm vi nhất định hoặc nếu bạn cần bật một trường tùy chỉnh dựa trên giá trị trường tùy chỉnh khác ).


cảm ơn - Tôi mặc dù về cách tiếp cận như vậy - xin vui lòng xem chỉnh sửa. 2 vấn đề: 1) Dữ liệu phát triển thành hàng, có nghĩa là để có được một bức tranh đầy đủ về người dùng, bạn sẽ phải thực hiện nhiều lần tham gia. 2) "giá trị" sẽ luôn được lưu trữ dưới dạng VARCHAR để chung chung, ngay cả khi giá trị thực sự là int hoặc boolean, v.v.
noobcser 11/03/2015

1
@noobcser Dữ liệu tăng lên khi các hàng không thực sự quan trọng, sau khi tất cả các cơ sở dữ liệu đang thiết kế xung quanh các hàng và tham gia. Trong mọi trường hợp, nhiều khả năng bạn sẽ sử dụng Biểu thức bảng chung cho việc này khá tốt cho loại điều này. Tôi không chắc chắn nếu bạn bỏ lỡ phần mà tôi đã nói bạn có thể sử dụng sql_variant làm kiểu dữ liệu cho cột giá trị, nơi lưu trữ giá trị dưới dạng bất kỳ loại nào bạn dính vào. Trong khi tôi đặt tên các tính năng của máy chủ MS SQL, tôi mong muốn các DBMS trưởng thành khác có các tính năng tương tự.
Andy

1
@noobcser FYI Tôi thực sự đã gặp những yêu cầu này khá thường xuyên trong sự nghiệp và có kinh nghiệm với từng giải pháp được đề xuất, vì vậy tôi đề xuất một trong những giải pháp tốt nhất theo kinh nghiệm của tôi. Việc sử dụng các kiểu dữ liệu xml cho loại điều này là một phần lý do tại sao tôi ghét việc MS thêm xml làm kiểu dữ liệu gốc.
Andy

1

Một thay thế cho các câu trả lời khác là có một bảng gọi là profile_attrib hoặc tương tự rằng lược đồ được quản lý hoàn toàn bởi ứng dụng của bạn.

Khi các thuộc tính tùy chỉnh được thêm vào, bạn ALTER TABLE profile_attrib ADD COLUMN like_movie TINYINT(1), bạn có thể cấm xóa chúng. Điều này sẽ giảm thiểu sự tham gia của bạn, trong khi vẫn cung cấp sự linh hoạt.

Tôi đoán rằng sự đánh đổi bit là ứng dụng hiện cần các đặc quyền bảng thay đổi cho cơ sở dữ liệu và bạn phải khéo léo trong việc vệ sinh các tên cột.


Các biểu hiện thông thường [^\w-]+nên làm điều đó khá tốt, không cho phép bất cứ điều gì không - 0-9A-Za-z_-nhưng đúng vậy, vệ sinh là điều bắt buộc ở đây để bảo vệ chống lại sự độc hại hoặc sự ngu ngốc.
Joe thường xuyên

0

Câu hỏi của bạn có nhiều giải pháp tiềm năng. Một giải pháp là lưu trữ các thông tin bổ sung dưới dạng XML. XML có thể được lưu trữ dưới dạng văn bản hoặc nếu bạn sử dụng cơ sở dữ liệu hỗ trợ các loại XML dưới dạng XML (SQL Server). Lưu trữ dưới dạng văn bản giới hạn khả năng truy vấn của bạn (như tìm kiếm trên một thuộc tính tùy chỉnh), nhưng nếu lưu trữ và truy xuất là tất cả nhu cầu của bạn thì đó là một giải pháp tốt. Nếu một người cần truy vấn, thì việc lưu trữ XML dưới dạng một loại XML sẽ là một lựa chọn tốt hơn (mặc dù điều này là cụ thể hơn của nhà cung cấp).

Điều này sẽ cung cấp cho một khả năng lưu trữ bất kỳ số lượng thuộc tính nào cho khách hàng chỉ bằng cách thêm một cột bổ sung trên bảng khách hàng. Người ta có thể lưu trữ các thuộc tính dưới dạng băm hoặc từ điển, người ta sẽ mất an toàn kiểu vì mọi thứ sẽ là một chuỗi bắt đầu, nhưng nếu một thực thi chuỗi định dạng chuẩn cho ngày, số, thì booleans sẽ hoạt động tốt.

Để biết thêm thông tin:

https://msdn.microsoft.com/en-us/l Library / hh403385.aspx

Câu trả lời của @ WalterMitty cũng hợp lệ, mặc dù nếu một người có nhiều khách hàng với các thuộc tính khác nhau, người ta có thể kết thúc với nhiều bảng nếu theo mô hình thừa kế. Nó phụ thuộc vào số lượng thuộc tính tùy chỉnh được chia sẻ giữa các khách hàng.


Điều này cũng có thể hoạt động tốt, nhưng tôi cảm thấy bị hạn chế một khi bạn thực sự cần phải làm gì đó chống lại dữ liệu được lưu trữ trong trường XML / JSON.
Andy

@Andy - Đúng, có một lớp khác. Truy vấn DB và phân tích cú pháp XML trái ngược với chỉ truy vấn DB. Tôi không biết nếu tôi gọi nó là hạn chế, chỉ là cồng kềnh hơn. Nhưng, nó sẽ có một cái gì đó để xem xét nếu các thuộc tính tùy chỉnh được sử dụng rộng rãi.
Jon Raynor

Trong T-SQL, có thể định nghĩa nội dung trong cột XML / JSON dựa vào không gian tên và truy vấn đối với các phần tử trên dữ liệu tùy chỉnh. Điều đó không khó
Stephen York

-1

Bạn nên bình thường hóa cơ sở dữ liệu của mình sao cho bạn có 3 bảng khác nhau cho mỗi loại hồ sơ công ty khác nhau. Sử dụng ví dụ của bạn, bạn sẽ có các bảng với các cột:

USER_ID, LIKE_MOVIE, LIKE_MUSIC

USER_ID, FAVORITE_CUISINE

USER_ID, OWN_DOG, DOG_COUNT

Cách tiếp cận này giả định rằng bạn sẽ biết hình dạng thông tin mà một công ty muốn lưu trữ trước khi ra tay và nó sẽ không thay đổi thường xuyên. Nếu hình dạng của dữ liệu không xác định tại thời điểm thiết kế, có lẽ sẽ tốt hơn nếu đi với trường JSON hoặc cơ sở dữ liệu nosql.


-1

Vì lý do này hay lý do khác, cơ sở dữ liệu là một lĩnh vực trong đó hiệu ứng nền tảng bên trong xuất hiện thường xuyên nhất. Đây chỉ là một trường hợp khác của mô hình chống bật lên.

Trong trường hợp này, bạn đang cố gắng chống lại giải pháp tự nhiên và chính xác. Người dùng của Công ty A không phải là người dùng của Công ty B và họ nên có các bảng riêng cho các lĩnh vực của riêng họ.

Nhà cung cấp cơ sở dữ liệu của bạn không tính phí cho bạn bởi bảng và bạn không cần gấp đôi dung lượng đĩa cho hai lần bảng (thực tế, có hai bảng hiệu quả hơn vì bạn không lưu trữ các thuộc tính của A cho người dùng B. Thậm chí chỉ lưu trữ NULL chiếm không gian).

Tất nhiên, nếu có đủ các trường chung, bạn có thể đưa các trường đó vào bảng Người dùng chung và có khóa ngoại trong mỗi bảng người dùng dành riêng cho công ty. Đây là một cấu trúc đơn giản đến mức không có trình tối ưu hóa truy vấn cơ sở dữ liệu nào phải vật lộn với nó. Bất kỳ THAM GIA cần thiết là tầm thường.


3
Và nếu bạn có hàng ngàn khách hàng, mỗi bảng có thể nhanh chóng trở nên không thể nhầm lẫn, chưa kể rằng bạn sẽ cần mã tùy chỉnh cho các trường tùy chỉnh của mỗi khách hàng.
Andy

@Andy: Đoán xem? Tình hình sẽ còn khó khăn hơn nữa nếu bạn trộn hàng ngàn phương án khác nhau vào một bảng duy nhất! Và có, bạn có thể cần mã tùy chỉnh cho các trường tùy chỉnh. Một lần nữa, điều đó đơn giản hơn, không khó hơn, nếu mỗi khách hàng có một bảng riêng biệt, sạch sẽ. Cố gắng chọn các lĩnh vực của công ty X từ một ngàn người khác là một mớ hỗn độn đẫm máu.
MSalters

Bạn đang đề cập đến câu trả lời của tôi hoặc ý tưởng của OP về việc giải quyết tất cả các cột bổ sung vào bảng khách hàng?
Andy

2
Mục tiêu ở đây là tìm một giải pháp duy trì và có thể mở rộng. Tạo một bảng cho mỗi khách hàng chắc chắn là ngược lại với điều đó. Mỗi khi bạn lên một khách hàng mới, sẽ không thực tế khi: chạy tập lệnh tạo bảng, cập nhật mã của bạn (Đối tượng thực thể) và triển khai lại.
tsOverflow 13/03/2015

Toàn bộ ý tưởng sử dụng các bảng chia sẻ này cho tất cả các khách hàng tự nó là một cuộc thảo luận về kiến ​​trúc SaaS riêng biệt và có một số lý do chính đáng để giữ khách hàng ở các bảng khác nhau (hoặc thậm chí trong các cơ sở dữ liệu khác nhau, cho phép sao lưu / khôi phục và thu nhỏ theo từng khách hàng). Trong kịch bản này, việc tạo các cột cusotm trong bảng chính là không có trí tuệ. Tôi ủng hộ và tôi tự hỏi tại sao mọi người lại đánh giá thấp điều này chỉ vì họ không thích cách tiếp cận này. Hiệu ứng nền tảng bên trong là một thực tế: bằng cách sử dụng mô hình EVA, truy vấn của bạn sẽ khó hơn, tiết kiệm hơn, toàn vẹn hơn, v.v.
Drizin

-1

Giải pháp của tôi cho rằng bạn sẽ gọi truy vấn này từ một chương trình và bạn sẽ có thể thực hiện xử lý bài. Bạn có thể có các cột sau:

ID, COMPANY_ID, FIRST_NAME, LAST_NAME, EMAIL, CUSTOM_VALUES

CUSTOM_VALUES sẽ là cặp khóa lưu trữ và chuỗi giá trị. khóa sẽ là tên cột và giá trị sẽ là giá trị cột, vd

LIKE_MOVIE;yes;LIKE_MUSIC;no;FAV_CUISINE;rice

trong TÙY CHỈNH này, bạn sẽ chỉ lưu những thông tin tồn tại. Khi bạn truy vấn từ chương trình, bạn có thể tách chuỗi này và sử dụng nó.

Tôi đã sử dụng logic này và nó hoạt động tốt, chỉ là bạn sẽ phải áp dụng logic lọc trong mã chứ không phải trong truy vấn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.