هل قمت بتحديث فقط الحقول تغييرها أو كل المجالات؟

StackOverflow https://stackoverflow.com/questions/459669

  •  19-08-2019
  •  | 
  •  

سؤال

وأنا أتساءل عما اذا كان يستحق الوقت الملقم عند تحديث سجل لاسترداد سجل موجود، حلقة من خلال مجالات التحقق من التغييرات وفقط وضع حقول تغير في استعلام التحديث؟ (أنا باستخدام ماي وPHP).

والسبب الرئيسي لذلك هو للحد من حجم استعلام التحديث لأغراض سجل التغيير. عادة الاستعلام قد يكون 15 حقلا، ولكن في الواقع يتم تغيير حقول 2 فقط. ويمكن بعد ذلك أن تستخدم أيضا هذا الاستعلام عن تسجيل لأنها سوف تحتوي فقط على الحقول المتغيرة، وبالتالي من السهل تحليل.

وقلقي هو الوقت الذي يستغرقه لاسترداد سجل موجود.

وأم أن هناك طريقة لاسترداد من الخلية الحقول التي تحديثه؟

هل كانت مفيدة؟

المحلول

وأعتقد أنه يستحق تغيير - ولكن ربما لا يستحق القيام حدد قبل إدراج

وأنا فقط تحديث الحقول التي تغيرت، انها جزء من عملية صفي DbEntity الذي يتبع نمط أكتيفيريكورد. يكلف اضافية قليلا للقيام بذلك لأنني يحمل الرقم القياسي الحالي والسجلات الأصلية نسخ ببساطة، وكلما يتم تحميل رقما قياسيا.

والأسباب هي الإيجاز - وليس حقا الأداء. كما يمكنك التحقق من وجود تعديل المتزامنة بإضافة بند فيها على القيمة القديمة من المجالات المستحدثة ورمي الخطأ المناسبة.

في طريقة الكتابة / تحديث:

$s1 = "";

foreach ($this->record as $key => $value)
{
    // only update fields that have been changed
    if ($value != $this->orig_record[$key])
    {
        $s1 .= $comma."`$key`='".mysql_real_escape_string($value)."'";
        $comma = ", ";
    }
}

$query = "UPDATE ".$this->table." SET $s1 where {$this->id_field}='".$this->get_keyfield()."'";
$query .= $this->extra_sql_update;
mysql_query($query);

$ar = mysql_affected_rows();
//
// the number of affected rows is actually those changed by the update operation, which will 
// either be zero, or 1. If the query affects more than one row then we have a problem.
if ($ar < 0 || $ar > 1)
{
    cbf_error("cbf_dbentity: {$this->table} :: only one row (not $ar) must be affected by an insert operation. $query",
      E_USER_ERROR);
}
else
{
    $new_id = $this->get_keyfield();

    GlobalEventBus::notify_all(new AuditLogSQL($this->table, "update", $query));

}

$this->orig_record = Array();

foreach ($this->record as $key => $value)
    $this->orig_record[$key] = $value;


//
// sanity check - ensure that what we have just written is actually there.

$this->load($new_id);

foreach ($this->orig_record as $key => $value)
    if (trim($this->record[$key]) != trim($value) 
        && (!$this->record[$key] == "0" && $value=""))
        cbf_error("cbf_dbentity: {$this->table} :: record differs during write after reload: field $key was \"$value\", after write it is now \"".
              $this->record[$key]."\"",E_USER_ERROR);

في الأسلوب تحميل

$this->orig_record = Array();
foreach ($this->record as $key => $value)
    $this->orig_record[$key] = $value;

نصائح أخرى

وعلى المستوى الأكثر أساسية، إذا أنا أقرأ سؤالك الحق، بشكل عام لا تريد تحديث عمياء السجل بأكمله في حال قام مستخدم آخر تحديث بالفعل أجزاء من ذلك السجل الذي قد لا تغير في الواقع. هل عمياء وداع العودة التحديثات الخاصة بهم.

وأعتقد خوارزمية الحالية قد يؤدي إلى يكتب القذرة، إذا كنت تريد الذهاب لقراءة التيار مرة واحدة من أجل التحديث، والسماح التحديثات التي يتعين اتخاذها في الذاكرة، ثم قرأ السجل مرة أخرى للسماح لك لمعرفة أي كانت الحقول محدث. ماذا يحدث إذا تحديث مستخدم آخر هذا السجل وراء ظهرك، مما يؤدي خوارزمية الخاص للاعتقاد بأن <م> أنت كانت واحدة لتحديث هذا المجال؟ ولكن في المقام الأول، يجب أن لا يكون لقراءة كل سجل مرتين لتنفيذ عملية تحديث واحد.

وإذا كانت البيانات لا غالبا ما تؤدي إلى صراعات، قد تستفيد من القراءة عن تأمين متفائل، حتى لو لم تختر لتنفيذه.

لقد نفذت أسلوب واحد هنا حيث قمت بإضافة التحديث الزمني أو تدريجي العمود التحديث رقم إلى الجدول الخاص بك. ثم في حياتك رمل الذاكرة / ويمكنك تتبع الحقول التي قمت بتعديل (oldvalue / NEWVALUE)، ويمكنك إصدار بحرية SQL التحديث لهذا السجل لتلك الحقول، "UPDATE ... حيث UPDATENUM = و-الأصلي-العدد "(أو WHERE = UPDATETS للالأصلية الطابع الزمني)، والتأكد من أن SQL التحديث بزيادة أيضا UPDATENUM أو UPDATETS، حسب الاقتضاء. إذا كانت السجلات المتأثرة بهذا SQL التحديث هو 0 تعرف أن شخصا آخر قد عدلت بالفعل هذا السجل في الخلفية ويمكنك الآن أن الصراع. ولكن على الأقل كنت لا الكتابة التغييرات شخص آخر، ويمكنك بعد ذلك إعادة قراءة البيانات الجديدة أو أن يكون المستخدم الخاص بك لحل النزاع.

وأبطأ نقطة في التطبيق الخاص بك دائما ما يكون الوصول إلى قاعدة البيانات الخاصة بك، حتى إذا كنت يمكن تسريع وتيرة ذلك، انها فكرة جيدة. وقال أن حقا يعتمد قاعدة بيانات كبيرة كيف بك، والسجلات، وكيف تكون كبيرة المرجح أن تنمو ل، حول ما إذا كان الأمر يستحق الجهد للتحقق برمجيا سواء قمنا بتحديث العناصر. إذا كانت قاعدة البيانات الصغيرة والوصول بالفعل سريعة جدا، قد لا يكون يستحق الوقت. ولكن إذا كان يمكن تحسين السرعة، وأنها تعطيك ميزة إضافية لتسجيل الخاص بك، ثم يذهب لذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top