SQL dane reakcji chemicznej

0

Witam, chce przechowywać w bazie danych informacje na temat reakcji chemicznych i związków chemicznych, mam taki plan:

trzy tabele tak wyglądajace:

compounds

compounds_id
compounds_name
compounds_mass

reactions

reactions_id
reactions_topic
reactions_desc

data

data_id
reactions_id
compounds_id

w tabeli data będę przechowywał id reakcji i id związków które w danej reakcji biorą udział czyli będzie to coś takiego:

data_id reactions_id compounds_id
1 1 1
2 1 2
2 1 3

Czyli w reakcji 1 używam trzech związków, i teraz mam pytanie jak wprowadzić rozróżnienie na substraty i produkty reakcji? Bo jeśli jest tak jak teraz to nie wiem która z substancji w tabeli data to substraty a które produkty - potrzebne mi to żeby zrobić wyszukiwanie po produkcie albo substracie reakcji.

0

wypadało by dla laików wyjaśnić czym się różni substrat od produktu i jak już będziesz to wyjaśniał to odpowiedź na Twoje pytanie powinna Ci sama się nasunąć

0

Substraty to te substancje które ulegają przemianie w wyniku reakcji a produkty to te związki które powstają:

A + B -> C + D

A i B - substraty
C i D produkty

Czyli np dodać koleją kolumnę do tabeli data i da jej pomocą oflagować substancje i na tej podstawie rozróżniać czy co substrat czy produkt?

0

to chyba jedyne rozsądne rozwiązanie, bo zapewne raz komponent może być substratem raz produktem więc oznaczanie go na etapie wprowadzania komponentu do systemu mija się z celem

0

Z tego co pamiętam ze szkoły, Reakcja to proces, który na wejściu dostaje Substraty, a na wyjściu daje Produkty.

Z tego mamy encje:
Reakcja
Produkt - kwas siarkowy, ... ,
Substrat - woda, siarka , tlen, ...

W wyniku reakcji może powstać wiele produktów i produkty mogą powstawać w wielu reakcjach i z substratami podobnie, więc mamy relacje wiele do wielu.

Te relacje wiele do wielu rozbiłbym następująco:
Reakcja_Produkt -- w reakcji X powstało M jednostek produktu
Reakcja_Substrat -- w reakcji X wykorzystano N jednostek substratu

Szukasz reakcji po produktach => złączenie Reakcja, Reakcja_Produkt
Szukasz reakcji po substratach => złączenie Reakcja, Reakcja_Substrat

Nie wiem czy reakcja może być powtarzana i w ten sposób zbierane serie danych, tak by później wyniki poddawać obróbce statystycznej etc.

0
yarel napisał(a):

Z tego co pamiętam ze szkoły, Reakcja to proces, który na wejściu dostaje Substraty, a na wyjściu daje Produkty.

Z tego mamy encje:
Reakcja
Produkt - kwas siarkowy, ... ,
Substrat - woda, siarka , tlen, ...

W wyniku reakcji może powstać wiele produktów i produkty mogą powstawać w wielu reakcjach i z substratami podobnie, więc mamy relacje wiele do wielu.

Te relacje wiele do wielu rozbiłbym następująco:
Reakcja_Produkt -- w reakcji X powstało M jednostek produktu
Reakcja_Substrat -- w reakcji X wykorzystano N jednostek substratu

Szukasz reakcji po produktach => złączenie Reakcja, Reakcja_Produkt
Szukasz reakcji po substratach => złączenie Reakcja, Reakcja_Substrat

Nie wiem czy reakcja może być powtarzana i w ten sposób zbierane serie danych, tak by później wyniki poddawać obróbce statystycznej etc.

A jak w takim przypadku wyświetlić reakcji w postaci
substrat_1 + substrat_2 + sunstrat_n -> produkt_1 + produkt_2 + produkt_n

0
antoni_22 napisał(a):

A jak w takim przypadku wyświetlić reakcji w postaci
substrat_1 + substrat_2 + sunstrat_n -> produkt_1 + produkt_2 + produkt_n

Wyciągnąć dane o substratach, wyciągnąć dane o produktach i wyświetlić:

-- substraty
select s.nazwa_substratu,r.*,rs.* from reakcje r, reakcje_substraty rs, substraty s where r.r_id=rs.r_id and rs.subs_id=s.subs_id and r.r_id=1234;

-- produkty
select p.nazwa_produktu, r.*,rp.* from reakcje r, reakcje_produkty rp, produkty p where r.r_id=rp.r_id and rp.prod_id=p.prod_id and r.r_id=1234;

Kodu nie testowałem, ale idea powinna być jasna.

0

Nie podoba mi się nazwa "data" dla tabeli z elementami reakcji.

Tabele proponuje nazwać reaction_compounds i dodać do niej pola:
rc_id,
compounds_id,
reactions_id,
quantity,
change

Gdzie change przyjmowało by wartości -1 (dla substratów), 0 (dla katalizatorów), 1 dla produktów.

W takim przypadku np. prosta reakcja 2H2 + O2 -> 2H2O mogła by być zapisana jako

reactions_id = 1

compounds_id | compounds_name | compounds_mass
1 | H2 | 2
2 | O2 | 32
2 | H2O | 18

Zaś sama reakcja

rc_id | compounds_id | reactions_id | quantity | change
1 | 1 | 1 | 2 | -1
1 | 2 | 1 | 1 | -1
1 | 3 | 1 | 2 | +1

Dzięki takiemu zapisowi bardzo łatwo jest sprawdzić poprawność reakcji (oczywiście zakładając, że compounds_mass to masa cząsteczkowa).

Dla pojedynczej reakcji wynik zapytania powinien wynieść 0

select sum (rc.quantity*rc.change*c.compounds.mass) as result
  from reaction_compoudns as rc,
       compounds          as c
 where rc.reactions_id = 1
   and rc.compounds_id = c.compounds_id
 

Poniższe zapytanie pokaże wszystkie reakcje błędne (takie, w których nie jest spełniona zasada zachowania masy):

select rc.reactions_id,  sum (rc.quantity*rc.change*c.compounds.mass) as result
  from reaction_compoudns as rc,
       compounds          as c
 where rc.compounds_id = c.compounds_id
having sum (rc.quantity*rc.change*c.compounds.mass) <> 0
 group by rc.reactions_id
 
0

Na sprawdzaniu bilansu mi nie zależy szczerze mówiąc. Większość reakcji które chce przechowywać to raczej tylko schematy reakcji organicznych gdzie współczynniki stechiometryczne nie mają znaczenia tak naprawdę dla idei reakcji.

0
antoni_22 napisał(a):

Na sprawdzaniu bilansu mi nie zależy szczerze mówiąc. Większość reakcji które chce przechowywać to raczej tylko schematy reakcji organicznych gdzie współczynniki stechiometryczne nie mają znaczenia tak naprawdę dla idei reakcji.

Czyli zapis typu: H2 + O2 - > H2O ?

W takim przypadku znakowałbym tylko za pomocą -1 , + 1 lub używając w reakcji dodatkowego pola: role_in_reaction

0

Wydaje mi się, że jest to najlepsza opcja, oznaczę substancje w zależności od tego jaką role pełnią w danej reakcji (substrat, produkt, katalizator) a potem tylko będę pobierał te dane z tabeli i wyświetlał w formie
a + b -> c
Mam jeszcze pytanie czy jest jakaś klasa PHP do rysowania wzorów strukturalnych ?

1 użytkowników online, w tym zalogowanych: 0, gości: 1