データベースと .NET の基本
.NET
は忘れていい。というか引きずると超ハメられる。
決して .NET
程リッチなつくりではないのだから…。
SQL から SOQL への移行
- SOQL はあくまで検索機能しかない (insert, update 等は DML であって SOQL ではない)
- SOQL は標準的に
SELECT *
はできない(ことになっている)。
調べれば分かるがsummer 21
アップデートでFIELDS
が入るので、事実上の*
はできるようになる。(制限として 200 行以下縛りがある)Salesforce Spring '21の新機能、SOQLのFIELDS()関数について - TerraSkyBase | テラスカイを支える人とテクノロジーの情報を発信する基地局
通常は必要なフィールドを全部列挙する。 - クエリの作成は ワークベンチ を使うこともできる。てーかめんどくさくて普通の開発では使わないけど。
LIKE
等は普通に使える。ORDER BY
やLIMIT
等も普通に使える。JOIN
はできない。CONTAIN
も存在しないし、サブクエリも実質存在しない(SQL使いにしてみれば F〇CK YOU! と叫びたくなる)has-a
関係やリレーション項目が存在していれば、そこを経由して検索することができる。
SELECT Name, (Select FirstName, LastName FROM Contacts) FROM Account
SOSL クエリの作成
全文検索クエリが使える。SOSL 基盤には Lucene が使われている。
ただしインデックスがどう使われるかは開発者が操作できない…
FIND {"grand*"} IN ALL FIELDS RETURNING Account(Name), Contact(LastName, FirstName, Email)
まぁ割と見たまま過ぎて突っ込むこともないよね。
効率的なクエリの作成
クエリ自体はバックエンドが Oracle なんでオプティマイズはその辺任せ。
デフォルトでは以下の項目にインデックスができる。
インデックスは DB が高速に検索するための設定
- Id
- Name
- OwnerId
- CreatedDate, SystemModStamp
- RecordType
- 主従項目、参照項目
- unique 制約を入れた項目
- 外部ID項目
クエリプランは開発者コンソールから
で出てくる
DML を使用したレコードの変更
開発者コンソールからガンガン行ける。
もしくは insert
などのDML句を使おう。Database クラスからでも操作できる。
// Add Account Account acct = new Account( Name='Test Account', Phone='(225)555-8989', NumberOfEmployees=10, BillingCity='Baton Rouge'); Database.SaveResult[] results = Database.insert(acct, false);
検索ソリューションの基礎
適切な検索ソリューションの選択
SOQL と SOSL の使い方…って上記で差は書いてるよね…
他の検索機能として Search Suggested Records
/ Search Suggested Articles
という REST API がある。
- オートコンプリートの結果とインスタント結果
Search Suggested Records
これはレコード検索: https://developer.salesforce.com/docs/atlas.ja-jp.224.0.api_rest.meta/api_rest/resources_search_suggest_records.htm - ナレッジ検索 Search Suggested Article Title Matches : https://developer.salesforce.com/docs/atlas.ja-jp.224.0.api_rest.meta/api_rest/resources_search_suggest_title_matches.htm
- ナレッジ検索 Search Suggested Queries : https://developer.salesforce.com/docs/atlas.ja-jp.224.0.api_rest.meta/api_rest/resources_search_suggest_queries.htm
一般的な使用事例での検索の作成
検索事例の説明ですね。
一般的な使用事例での検索の作成 単元 | Salesforce Trailhead
検索結果の最適化
- 効率的なテキスト検索の作成: 要するに検索対象となるデータは制限しませう。返ってくるデータも制限しよう。
- 検索範囲を
IN
で制限FIND {jsmith@cloudkicks.com} IN EMAIL FIELDS RETURNING Contact
- 取得行を
LIMIT
やOFFSET
で取得(加えて取得するデータも制限) :FIND {Cloud Kicks} RETURNING Account (Name, Industry ORDER BY Name LIMIT 10 OFFSET 25)
- 特定の設定
WITH
突っ込んで制限WITH DIVISION
: ディビジョンの機能 で分割されている場合にその範囲を指定できるWITH DATA CATEGORY
: Salesforce ナレッジの記事と質問の検索で使用。データカテゴリを指定して検索可能WITH NETWORK
: サイトユーザとフィードを検索に利用可能。複数サイトを持っているときにネットワークID指定で区分できるWITH PricebookId
: なんじゃこら? PriceBookId なるものを指定してフィルタ出来るらしい。Product2 オブジェクト専用だそうです。 https://developer.salesforce.com/docs/atlas.en-us.soql_sosl.meta/soql_sosl/sforce_api_calls_sosl_with_pricebook_id.htm
- 検索範囲を
後はシノニム(同義語)。まぁ表記ゆれ対策ですね。Playstation, PS, Play Station, プレステ どれも同じものを指してますが表記が違う。
これに対処するため、同義語辞書が存在します。