<prompt> Ninaunda hifadhidata kwa kutumia Postgres. Kwa kesi yangu ya utumiaji, ninahitaji mfano wa data wa kawaida. Hasa, ninahitaji kuhifadhi Vyombo vya aina tofauti. Vyombo vyote vina seti ya nyanja za kawaida, na kisha zina mali ya ziada kulingana na aina yao. Kwa mfano, tuseme kwamba Mashirika yanawakilisha Matukio. Matukio yote yana kichwa na maelezo. Lakini ikiwa Tukio ni la aina ya Maoni, litakuwa pia na sehemu za ziada kama mada na idadi ya zinazopendwa.Mahitaji yangu kuu ni kama ifuatavyo:- Ninahitaji kutekeleza vizuizi SIO NULL kwa safu wima mahususi- Mfano wa data unapaswa kupanuliwa kwa urahisi. Kuongeza aina mpya ya Huluki kunapaswa kuwa rahisi, na hakuhitaji muda wa kupumzika kwa hifadhidata- Katika maombi yangu, nitakuwa na mtazamo unaoonyesha Mashirika yote, yaliyopangwa kulingana na tarehe. Kwa hivyo ninahitaji kuweza kuuliza Vyombo vyote, bila kujali aina zao, kwa njia ya haraka na bora.Unaweza kunielezea muundo wa muundo ambao unaweza kutumika kufikia mahitaji haya? Tafadhali ielezee kwa mfano halisi.  <response>: Mchoro mmoja wa usanifu unaowezekana ambao unaweza kutumika kufikia mahitaji haya ni mchoro wa Huluki-Sifa-Thamani EAV. Katika muundo wa EAV, mashamba ya kawaida yanahifadhiwa kwenye jedwali moja meza ya chombo, na mashamba ya aina maalum yanahifadhiwa kwenye jedwali lingine meza ya sifa, pamoja na maadili yao. Hii inaruhusu muundo wa data unaonyumbulika na kupanuka.Huu hapa ni mfano wa jinsi unavyoweza kutumia muundo wa EAV kuhifadhi Matukio ya aina tofauti kwenye hifadhidata ya Postgres:1. Kwanza, unda jedwali la kuhifadhi sehemu za kawaida za Matukio yote:CREATE TABLE matukio id UFUNGUO WA MSINGI WA SERIAL, MAANDIKO ya kichwa SI UFUPI, MAANDIKO YA maelezo SI UFUPI, tarehe TIMESTAMP NOT NULL;2. Kisha, unda jedwali ili kuhifadhi aina mahususi za nyuga za Matukio:CREATE TABLE event_attributes id UFUNGUO WA MSINGI WA SERIAL, kitambulisho_cha tukio INTEGER SI UFUPI, attribute_name TEXT NOT NULL, attribute_value TEXT NOT NULL, CONSTRAINT event_attributes_event_id_fkey UFUNGUO WA NJE kitambulisho_cha tukio MAREJEO matukioid JUU YA KUFUTA MTINDO.;Katika jedwali hili, kila safu inawakilisha sifa maalum ya Tukio mahususi. Safu ya attribute_name ina jina la sifa k.m., mada au idadi ya kupendwa, na safu wima ya attribute_value ina thamani ya sifa.3. Ili kuongeza aina mpya ya Tukio, ungeongeza tu safu mlalo mpya kwenye jedwali la tukio_attributes lenye thamani zinazofaa za attribute_name na attribute_value. Kwa mfano, ili kuongeza Tukio la Maoni lenye sifa ya mada na sifa ya idadi ya kupendwa, unaweza kufanya yafuatayo:-- Ongeza Tukio jipya la MaoniINGIA KATIKA matukio kichwa, maelezo, tarehe MAADILI Tukio Langu la Maoni, Haya ni maoni yangu, SASA;-- Ongeza sifa ya mada.INGIA NDANI ya sifa_za_tukio kitambulisho_cha_tukio, jina_la_sifa, thamani_ya_sifa THAMANI 1, mada, Mada Yangu;-- Ongeza sifa ya idadi ya kupenda.INGIA NDANI ya sifa_za_tukio kitambulisho_cha_tukio, jina_la_sifa, thamani_ya_sifa THAMANI 1, idadi ya kupendwa, 10;4. Kuuliza Matukio yote, bila kujali aina zao, unaweza kutumia swali la JIUNGE:CHAGUA matukio., event_attributes.attribute_name, event_attributes.attribute_valueKUTOKA kwa matukioLEFT JIUNGE na event_attributes KWENYE events.id event_attributes.event_idAGIZA KWA matukio.tarehe DESC;Hoja hii itarejesha Matukio yote, pamoja na sifa zao, zilizopangwa kulingana na tarehe.Kwa kutumia mchoro huu wa EAV, unaweza kutekeleza vizuizi NOT NULL kwenye safu wima mahususi kwa kuongeza tu vizuizi kwenye jedwali la tukio_sifa. Na kwa sababu kielelezo cha data ni cha kawaida na kinaweza kupanuka, unaweza kuongeza aina mpya za Mashirika kwa urahisi bila kuchelewa kwa hifadhidata. 