問題タブ [database-agnostic]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
database - 多対多のテーブルに主キーが必要ですか?
多対多の関係を持つ 2 つのオブジェクトがある場合、通常はデータベース スキーマでそれらをモデル化し、多対多のテーブルを使用して 2 つを関連付けます。しかし、その多対多テーブル (または「結合テーブル」) には、独自の主キー (整数自動インクリメント) が必要ですか?
たとえば、それぞれ ID を持つテーブル A と B と、(A_ID, B_ID) の外部キー タプルを持つ A_B というテーブルがあるとします。しかし、A_B には、独自の主キーの自動インクリメント ID 列が必要ですか?
追加するメリットとデメリットは?私は個人的に、多対多結合の自然キーが好きです。しかし、主キーによってどのような利点が追加されるのでしょうか?
mysql - とにかく完全にスキャンする必要があるテーブルのインデックスですか? (MySQL)
私はここでかなり困惑しています。
私は2つのテーブルを持っており、どのレコードが最初のもので2番目のものではないかを調べるために、最初のもの(約50万レコード)と2番目のもの(約220万レコード)を結合したままです。(典型的な「b.attribute is null」ナンセンス)
最初のテーブルでインデックスが使用されるのはなぜ (どのように) ですか? とにかく、最初のテーブルのすべてのレコードを通過する必要がありますが、最初のテーブルでインデックス(または主キー..これはすべてETLであるため必要ありません)なしでこの結合を実行しようとすると、クロールします。
ちなみに、innodbを使用しています。
ヘルプ?
EDIT : 2 番目のテーブルにインデックスが付けられます。最初はそうではありませんでした。
java - HibernateCriteriaAPIのRestrictions.likeと.ilikeの違い
HibernateのCriteria
APIにRestrictions.ilike
は、次のコントラクトを持つ関数があります。
Postgres ilike演算子に似た、大文字と小文字を区別しない「like」
カッコいい。しかし、同じクラスにもlike
機能があり、はるかにあいまいな契約があります。
名前付きプロパティに「like」制約を適用します
例
sql - SQL Server から移植可能な挿入を作成する方法は?
今、それは次のような挿入を生成します
これは非常に SQL Server 固有のものです。データベースにとらわれず、誰もが使えるスクリプトを作成したいと考えています。私は非常に単純なデータ型を持っています - varchars、numbers、dates、bits(boolean)。
おもう
すべての DBMS で動作するはずですよね?
sql - RDBMSでの柔軟な関係の実装-実際のトレードオフは何ですか?
私は、製品ごとに異なる可能な属性の束を持つ製品の束を持っています。たとえば、製品Aには名前、サイズ、色、形があります。製品Bには、名前、カロリー、砂糖などがあります。これを解決する1つの方法は、次のとおりです。
1)テーブルを作成する
これにより最大限の柔軟性が得られますが、理由はわかりませんが、多くの人がこれに反対することを勧めていると聞いています。つまり、これらのテーブルがTeams、Players、Team_Playersと呼ばれる場合、これが適切なリレーショナル設計であることに同意します。
これがなぜ悪いのかを私に説明する人は誰でも、基本的ないくつかの基本的な初期テーブル(object、attribute、object_attributeなど)を超えて実際のテーブルを作成することがない、完全に柔軟なリレーショナル設計のコンテキストでそうします。すべてが同意できるのは悪いことです。ただし、これははるかに限定されたバージョンであり(システム内のすべてのオブジェクトではなく、製品のみ)、これら2つのアーキテクチャをグループ化することは公平ではないと思います。
この設計を非常に悪くする原因となる問題(経験または理論)は何ですか?
2)これを解決する別の方法は、サイズ、色、形状、重量、砂糖などの列の束を含むProductテーブルを作成し、柔軟性を持たせるために最後にいくつかの追加の列を含めることです。これにより、ほとんどがNULLで満たされた一般的にまばらな行が作成されます。人々はこのアプローチを好む傾向がありますが、私の質問は、このアプローチがパフォーマンス上の利点を失う前に、いくつの列を持つことができるかということです。200の列がある場合、これはもはや賢明な動きではないと思いますが、100の列はどうでしょうか。50列?25列?
3)私が知っている最後のアプローチは、すべての属性をblob(おそらくJSON)としてProductsテーブルの単一の列に格納することです。私はこのアプローチが好きですが、それは正しく感じられません。クエリは難しいです。また、後で属性の名前を簡単に変更できるようにする場合は、すべてのレコードを個別に解析するか、IDを使用してBLOBにキーを設定する必要があります。idパスに移動すると、別のテーブル属性が必要になります。属性を上からアプローチ#1のように見せ始めますが、attribute_idをblobに結合できないため、何もクエリしたくないと思います。属性名で。
このアプローチで私が気に入っているのは、1つの製品にクエリを実行でき、コード内でその製品が持つすべてのプロパティに簡単にアクセスできることです。また、製品を削除しても、他のテーブルをクリーンアップする必要はありません。一貫性を保つのは簡単です。
4)いくつかのRDBMSで強く型付けされたxml形式にインデックスを付けることができることについていくつか読んだことがありますが、正直なところ、このアプローチについてはよくわかりません。
ハマった。アプローチ#1が最善の策だと思いますが、私が読んだすべてのことは、そのように悪臭を放っています。与えられた状況に最適な方法を決定できるように、この問題について考える正しい方法は何ですか?私がリストしたものよりも多くのアイデアが明らかに歓迎されています!
ruby-on-rails - ActiveRecord集計関数:データベースに依存しない'EXTRACT(WEEK from date)'はありますか?
私はうまく機能するメソッドを持っています(rails 3とPostgreSQLで); データベースに依存しないようにすることが可能かどうか疑問に思います:
私が理解しているように、日付から週のISO番号を抽出する方法は、常にデータベース固有です。
ここに示すように、仮想属性:weekのようなものを使用できますが、:groupオプションは生のSQLのみを受け入れるようです。私もこの解決策を見ましたが、それは私のニーズに合いません。もう1つの方法は、データベースビューを使用するか、コールバックメソッドで埋められた:week列を追加することですが、スキーマを台無しにしたくないのです。
それで、何か手がかりはありますか?
sql - データベースの文字列列挙型をそれだけの価値のある整数に変換していますか?
列挙型をデータベースに格納するには、文字列または整数の2つの方法があります。
列挙型(、、など)を文字列として保存するsex = {male,female}
とaccount_type = {regular,pro,admin}
、読みやすくなりますが、整数よりも多くのスペースが必要になります。
一方、整数では、データベースに列挙型をマッピングし、データベースから列挙型をマッピングする必要があります。利点として、大文字と小文字の区別はデータベースの外部で整数で処理されます。
両方にインデックスが付けられていると仮定すると、整数変換は一般的に価値がありますか?整数でのルックアップはどれくらい高速ですか?
例
おそらく、具体的な例が物事を視覚化するのに役立つ可能性があります。100,000ユーザーのデータベースで上記のaccount_typeを取り上げましょう。
文字列列挙型
8ビット固定長CHAR型を想定
整数列挙型
8ビットのTINYINT整数を想定
サイズは整数列挙型でほぼ半分のようです。また、インデックスを考慮する必要があります。
ruby-on-rails-3 - Rails 3 でこのデフォルト スコープを記述するための、よりデータベースに依存しない方法はありますか?
モデルの 1 つで次のデフォルト スコープが定義されています
MySQL を実行している開発マシンでは問題なく動作しましたが、postgres を使用する本番環境にデプロイすると失敗しました。ストレート SQL の代わりに Arel を使用してそれを記述する方法はありますか? FORMATS[:wide]
整数を返しますが、特定の順序ではない場合があります。format
その特定のレコードが最初に返されるようにしたいだけです。
database - 分散主キー-UUID、単純な自動インクリメント、またはカスタムシーケンシャル値?
この種の質問は以前に行われたことがありますが、私が考えているオプションを比較した質問は見つかりませんでした。なので、ここに投稿します。重複している場合はリンクを投稿してください。
これはかなり長い投稿になりました。時間があれば、質問は最後にありますので、読んでください。
EDIT2:今のところそれが最善の解決策になると思うので、私は答えを受け入れました。しかし、数字の連結についての私の質問に答える他の2つの質問をしたいと思いました。それらはここで見つけることができます:2つの整数を組み合わせて一意の数値を作成し、C#で整数を連結します。番号をエンコードしようとすると(以下の51122222のように)、これは便利だと思います。たぶん、c#でString.Formatのようなものを使用するだけで、私の小さなアプリケーションには十分高速です。
私は現在、同じデータベーススキーマを使用し、他のすべてのデータベースと同期できる1つのマスターデータベースと同期できる分散アプリケーションをセットアップする方法を見つけようとしています。
私が現在計画しているプログラムは、情報を追跡するためのかなり単純なプログラムとして開始されます。最初のバージョンには、ItemsとItemHistoryの2つのテーブルが含まれる場合があります。これは可能なフィールドの例です:
アイテム
ItemID(PK)?
名前文字列
コンテンツ文字列
ItemHistory
ItemHistoryID(PK)?
ItemID(FK)?
EventName String
CreatedOn DateTime
フィールド名とタイプをリストしました。この質問は、PKタイプに何を使用するかについてですので、それらは欠落しています。
最初のバージョンは標準のデスクトップアプリになります。現在、データベースにWPFフロントエンドとSQLiteでC#を使用することを計画しています。最終的には、Androidフォンでも実行できるバージョンを作成したいと思います。これが分散部分の出番です。私は常にシグナルを持っているわけではないので、アプリをオフラインで実行し、再びオンラインになったときに同期できるようにする必要があります。
IDの処理方法についてこれまでに考えたアイデアは次のとおりです。
- IDにUUIDを使用して、マージの競合が発生しないようにします
- 自動増分フィールドを使用して、アプリの各バージョンの開始番号を一定の増分で設定します。たとえば、最初のアプリの場合は1、2番目の場合は10000、3番目の場合は20000などです。
- 数値間の大きなギャップなしで競合を回避するために、オフセット値を持つ自動増分フィールドを使用します(mysqlにはこのためのauto_increment_incrementとauto_increment_offsetがあります)
- 各データベースのIDをエンコードする独自のIDを生成して、データベースが独自の自動増分値を持ち、競合を引き起こさないようにします。同じ考えを持っている他の誰かを見つけました:ID列に推奨されるデータ型は何ですか?
オプション1は機能し、過去に使用したことがありますが、UUIDの問題を回避するために他のオプションの可能性を検討したいと思います。デバッグ時に読みやすく、並べ替え可能なソリューションが欲しいです。
オプション2は機能しますが、レコード数に制限を強制します。私の小さなアプリケーションでは、それがそれほど多くなることはほとんどないことを知っていますが、そのような制限を必要としないソリューションがあるかどうかを試してみたいと思います。オプション3は、交互の数字を使用して制限を回避しますが、使用するデータベースの数を知る必要があると思います。そうでない場合は、すべての数字を入力する可能性があります。DB1で1の開始と1の増分を使用し、DB2で2の開始と2の増分を使用すると、すべての数値が交互に使用されます。増分として50を使用することもできますが、別の制限がありますが、それを使用できるアプリケーションの数に制限があります。繰り返しになりますが、私の状況では限界に達することはありませんが、突然非常に人気のあるアプリケーションでは問題になる可能性があることを私は知っています。
オプション4は私にとっては問題を解決できるようですが、実際に機能するかどうかはわかりません。私が持っていたアイデアの1つは、各アプリケーションにプレフィックスを設定できるようにすることでした。これにより、自動インクリメント値で使用できるようになりました。たとえば、PC上のレコードの場合はPC1、PC2、Androidのレコードの場合はPHONE1、PHONE2などです。これは機能しますが、文字列で数値を使用すると、1、11、100が隣り合って表示されるという並べ替えの問題が発生します。つまり、先行ゼロが少なくなり、再び限られた数のレコードに戻ります。
DBIDと自動インクリメントに数字を使用できるかどうか疑問に思いました。たとえば、PC=1およびPHONE=2の場合、PCには11、12、13などがあり、PHONEの11番目のレコードには111、304番目のレコードには2304があります。しかし、これがどのように行われるのか、またはそれが簡単に行われ、値を生成するための過剰なオーバーヘッドを引き起こさないのかどうかはわかりません。
職場では、同様の番号付けシステムを使用しており、この51122222のようなものを使用しています。5は、アプリケーションのインスタンスを参照し、次に2桁の年、最後に自動増分番号を参照します。1年で99999レコードを超えるとどうなるか、まだ明確な答えはありません。彼らはそれが起こらないと考えていたかもしれず、彼らがリスクを計算したことを喜んでいると思います。
最後に質問ですが、並べ替えを可能にし、制限を適用しない分散アプリケーションの主キーシステムを作成する方法はありますか(データ型自体のサイズ(最大整数など)以外)?
編集:これが私が書く予定のアプリに関するもう少しの情報です。取得する可能性のあるほぼすべてのタイプの情報を保存できるものを作成したいと思います。システムには、トピックを検索できるようにエントリにタグを付ける機能が含まれます。私がこれまでに見た情報の種類は、本、DVD、ウェブサイトなどに関する推奨事項である可能性があります。あるいは、私が住んでいる場所に関する地元のヒントかもしれません。全体的なアイデアの1つは、これらの情報をさまざまな形式の複数のコンピューター/ラップトップ/電話に分散させないようにすることです。
sql - NOW()は安定した関数ですか?
私が行った場合
2つのフィールドは両方の列で常に同一ですか?
同上
4つのデータベースエントリすべてが同じ値になるのでしょうか、それともrow1 <> row2になる可能性がありますか?
これは質問ではなく理論的な質問であることに注意してくださいwork-around
。
方法と理由を本当に知りたいだけです。