私は学校のさまざまな科目に使用されるさまざまな数式を保存するアプリケーションを構築しています。そのシナリオを表すために次のデータベースダイアグラムを作成しました。
リレーショナルデータベースで方程式を表現する方法を理解するのに苦労しています。
各方程式は、さまざまなタイプの変数で構成されています。例えば、
E=mc^2
次のコンポーネントがあります。
J
)のエネルギーであり、実際はkg*m^2*s^2
です。kg
)、これ以上分解できない3*10^8
、単位はm/s
です。問題は、データベース内の方程式の文字列の表現ではありません。むしろ、方程式内の個々の変数間の関係を表現したいと思います。
同じデータベース内でこれらの異なるタイプの変数をどのように表現する必要がありますか?
あなたの質問は、「この大きなもの(方程式)がこれらの小さなもの(変数)からどのように構成されているかをどのように示すことができるか」です。これは部品表の問題であり、階層の特殊なケースです。あなたの例は、変数だけでなく演算子も必要とするため、少し(しかしほんの少し)より複雑です。
与えられた方程式を評価するには、cの値を取り、それを2乗し、mを掛けて、結果をEに割り当てます。これらの順序は、最も内側から順に実行する必要があります。最も外側。これはツリーとして表すことができます1:
E
|
Multiply
| |
| m
Power
| |
c 2
リレーショナルスキーマでツリーを表すには いくつかの方法 があります。この問題については、隣接リストが最適だと思います。テーブルは次のようになります(非常に大まかな疑似コード)
create table Equation_Tree
(
row_id int not null primary key,
varialbe_name string null,
function_name string null,
sequence int not null,
parent_row_id int null foreign key references Equation_Tree.row_id,
constraint (exactly one of variable_name, function_name is populated)
)
方程式を評価するには、各中間ノードの作業値を格納する葉から根までツリーを歩きます。変数値は、ローカルパラメータから置換するか、2番目のテーブルから取得できます。
別のアプローチは、逆ポーランド記法を使用して評価することです。演算子とオペランドは、論理的な処理順序でトークンのシーケンスを形成します。そのような値は次のようになります。
create table Equation_RPH
(
varialbe_name string null,
function_name string null,
sequence int not null,
constraint (exactly one of variable_name, function_name is populated)
)
より単純なスキーマを持っている間、これはパーツ間の関係をそれほど明確に示しません。
1素晴らしい ASCIIフロー のおかげで、現在存在する最高のフューチャーレトロソフトウェアを入手できます。
ここに一つの提案があります。コンポーネントという用語を使用したので、それを使い続けますが、もっと良い用語があるでしょうか?
CREATE TABLE COMPONENTS
( COMPONENT_ID INT NOT NULL PRIMARY KEY
, ABBREVIATION CHAR(1) NOT NULL -- Example 'E'
, DESCRIPTION VARCHAR(50) NOT NULL -- Example 'Energy'
);
CREATE TABLE EQUATION_COMPONENT
( EQUATION_ID ...
, COMPONENT_ID ...
, PRIMARY KEY ( EQUATION_ID, COMPONENT_ID )
, FOREIGN KEY ( EQUATION_ID ) REFERENCES EQUATIONS ( EQUATION_ID )
, FOREIGN KEY ( COMPONENT_ID ) REFERENCESCOMPONENTS ( COMPONENT_ID )
);
たとえば、質量とエネルギーの両方に関するすべての方程式を見つけたい場合:
SELECT EQUATION_ID
FROM EQUATION_COMPONENT
WHERE COMPONENT_ID IN ( id:s for Mass and Energy )
GROUP BY EQUATION_ID
HAVING COUNT(COMPONENT_ID) = 2