2009-02-26 19 views
2

私は、いくつかのデータ関係を持つiPhoneアプリケーションで作業しています(著者 - >書籍など)。ユーザーがアプリケーションからAuthorオブジェクトを削除すると、Deleteキーで実行されるSQLiteトリガーがいくつか作成され、データベースから、作成者の主キーと一致する外部キーを持つブックが削除されます。コードまたはデータベースで伝播が伝播しましたか?

また、新しいアイテムが作成されたときにデータを挿入するためのトリガーも使用しています。

私はこれが悪いデザインであるかもしれないという気持ちを揺さぶったり、私が考えていない道のりで問題を引き起こしたりすることはできません。それは、データベースがそれを処理するための機能を備えている場合、私はこのような削除を伝播するのを処理する私のアプリのコードに依存する必要がありますか?

あなたは何ですか?

答えて

-1

コードがあなたのアプリに入ります。

トリガーはコードです。機能はあなたのアプリに入っています。データベースにはありません。

私は、データベースは処理用ではなくデータ用であるべきだと思います。私はアプリがデータではなく、処理に使われるべきだと思う。

データベースの処理機能は単に水を濁らせるだけです。

+0

私は同意しません。リレーショナル・インテグリティを保証するためのデータベース・メカニズムがあり、カスケード削除のように適切な場所で使用する必要があります。追加データを挿入するには、それは依存します。アプリ内で実行された場合は、必ず両方のインサートを単一のトランザクションでラップしてください。 – tvanfosson

+0

@tvanfosson:宣言的な参照整合性にはいくつかの価値があります。カスケーディングする削除、トリガー、および何も一般的に手を出せない。彼らが解決するよりも多くの問題を引き起こすように見える。技術的なものもあれば、組織的なものもあります。 –

+0

Decalrative参照整合性には大きな価値があります。これはクエリ・オプティマイザを支援し、データが現実世界の正しい表現であることを保証します。 )データベースのコーディングを学び理解していない場合は、担当者に任せてください; –

2

真。可能な限りデータベースの組み込み機能を使用してください。ちょっと試してみると、妥協のときにはが本当にのように要求します。

1

特に、更新/削除に関して、リレーショナルの整合性を保証するためにデータベースの機能を利用します。私はこれを避け、アプリケーションからすべてのデータを挿入する傾向がありますが、私はいくつかの追加データを挿入するためにトリガを使用する場合があります(監査に気を付ける)場合があります。ただし、複数の挿入を行っている場合は、1つのトランザクションですべてをラップするようにして、部分的な挿入で終わらないようにして、リレーショナル・インテグリティの損失を招く可能性があります。

1

データベースの組み込み機能(私はそれがどのように機能するかに慣れていない)を使用するアイデアが気に入っていますが、今から1年後にコードに戻っても問題ありません。 (コードが私の目の前に正しくないとすれば)。

私は想像していますが、何かが間違っていた場合、今はどういう仕組みになっているかを思い出させるためにコメントを追加してください。少なくとも、デバッグをする必要があるときにデータベース機能を再学習する必要はありません。 。

+0

この人にとっては、データベースが自動的に家を清掃し、データが破損しないように保つことができます。引き金がなければ、1年後にプログラマーはコード内の家をきれいにしてデータベースを壊すことを忘れるかもしれません。つまり、引き金を忘れることに害はありません。 –

1

あなたは私よりいくつか先行しています。私は最近トリガーでそのようなことを学びました。私はそれらを自分で使いたいと思っています。

他の回答に基づいて、これは哲学的選択のようです。 またはコードのいずれかを使用するのはおそらく問題ありませんが、一貫性を保つのが最良です。したがって、あるテーブルでカスケード削除のトリガを使用しないで、別のテーブルのCコードを使用しないでください。

iphoneに関する質問にタグが付けられているので、最も重要な違いはCコードとトリガーの相対的なパフォーマンスだと思います。違いを判断するためには、両方をコード化して実験しなければならないでしょう。

もう1つのことは、thedailywtf.comで読んだすべてのホラーストーリーのうち、約半数がデータベーストリガーを含むように見えるということです。

0

は、残念ながら、SQLiteはSQLiteのドキュメント等からカスケード削除にサポートしていません。

http://www.sqlite.org/omitted.html

FOREIGN KEY制約は、解析されますが、適用されません。ただし、同等の制約の適用はトリガーを使用して達成できます。 SQLiteソースツリーには、SQLiteデータベースを読み込み、外部キーの制約を分析し、適切なトリガーを自動的に生成するCプログラムのソースコードとドキュメントが含まれています。

トリガーをサポートしていますが、完全ではありません。欠落しているサブ機能には、FOR EACH STATEMENTトリガー(現時点ではすべてのトリガーはFOR EACH ROWでなければなりません)、表のトリガー(現行のINSTEAD OFトリガーはビューでのみ許可)、および再帰トリガー(自分自身をトリガーするトリガー)

したがって、SQLiteを使用している削除カスケードなどでコードを作成する唯一の方法は、トリガーが必要です。 種類: